在 .net Core 中使用 HttpClient 下载分块编码文件

10

我正在使用HttpClient通过API下载文件。当整个文件可以在一个请求中完成时,我能够正确地保存并打开文件。

当整个文件超过最大块大小时,我必须对API进行多次请求以获取文件,并且返回的是分块编码的数据。我的猜测是这些块没有被正确解码并保存到文件中,导致文件损坏。

是否有一种方法来对GetStreamAsync的响应进行分块解码?

public byte[] GetFileContent(File file)
{
    var baseFileUri = BASE_URI + $"platform/files/{file.Id}";

    int chunkSize = 128 * 1024;

    chunkSize = file.NativeSize <= chunkSize ? file.NativeSize : chunkSize;
    int start = 0;

    using (MemoryStream stream = new MemoryStream())
    {
        while (start < file.NativeSize)
        {
            Get(baseFileUri, new List<KeyValuePair<string, string>>() { new KeyValuePair<string, string>("offset", start.ToString()), new KeyValuePair<string, string>("size", chunkSize.ToString()) }, stream);

            start = start + chunkSize;

            if (file.NativeSize < start + chunkSize)
            {
                chunkSize = file.NativeSize - start;
            }
        }

        return stream.ToArray();
    }
}

private void Get(string uri, List<KeyValuePair<string, string>> parameters, Stream stream)
{
    var requestUri = BuildUriString(uri, parameters);

    var methodResult = _client.GetStreamAsync(requestUri);
    methodResult.Result.CopyTo(stream);
}

Stream.CopyTo已经进行了分块(默认大小为81920 https://referencesource.microsoft.com/#mscorlib/system/io/stream.cs,2a0f078c2e0c0aa8)。 - Simon Mourier
1个回答

0
在您的代码中,您正在通过多次请求手动获取块。当所请求的API支持分块响应时,您可以尝试设置"Transfer-Encoding": "chunked"头,并让HttpClient库处理分块响应。可以按以下方式在HttpClient上设置标头:
_client.DefaultRequestHeaders.TransferEncodingChunked = false;

需要检查API是否支持它。 - smurtagh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接