我的程序使用HttpClient向Web API發送GET請求,並返回一個文件。我可以直接從HttpResponseMessage流沒有通過內存流文件?
我現在使用此代碼(簡化)將文件存儲到光盤:
public async Task<bool> DownloadFile()
{
var client = new HttpClient();
var uri = new Uri("http://somedomain.com/path");
var response = await client.GetAsync(uri);
if (response.IsSuccessStatusCode)
{
var fileName = response.Content.Headers.ContentDisposition.FileName;
using (var fs = new FileStream("C:\test\" + fileName, FileMode.Create, FileAccess.Write, FileShare.None))
{
await response.Content.CopyToAsync(fs);
return true;
}
}
return false;
}
現在,此代碼運行時,該進程加載的所有文件到內存中。實際上,我更希望將流從HttpResponseMessage.Content流式傳輸到FileStream,以便只將其中一小部分保存在內存中。
我們正計劃在大文件(> 1GB)上使用它,那麼有沒有一種方法可以實現這一點,而不需要在內存中存儲所有文件?
理想情況下,無需手動循環讀取部分到byte []並將該部分寫入文件流,直到寫入所有內容爲止?
看看 - https://msdn.microsoft.com/en-us/library/system.web.http.hosting.ihostbufferpolicyselector(v=vs.118).aspx –
'CopyToAsync'已經在做你所描述的(在內部它反覆從響應中讀取一塊數據並將其寫入文件,直到所有數據都被傳輸),它不應該導致一次將整個文件緩存到內存。 – Iridium
這就是我所想的,然而看着內存消耗,它確實會將整個文件加載到內存中,這是我想避免的。 –