我正在使用API使用HttpClient下载文件。当我的整个文件适合一个请求时,我可以保存文件并正确打开它。
当整个文件不适合我的最大块大小时,我必须对我的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);
}
答案 0 :(得分:0)
在您的代码中,您通过执行多个请求来手动获取块。当请求的API支持分块响应时,您可能可以尝试设置"Transfer-Encoding": "chunked"
标头,并让HttpClient
库处理分块响应。标头可以在HttpClient上设置,如下所示:
_client.DefaultRequestHeaders.TransferEncodingChunked = false;