У меня есть файл, загружаемый из приложения Angular, и я хотел бы избежать использования MemoryStream, содержащего все данные.
Моя цель - прочитать то, что мне нужно (порция за порцией), а затем отправить эти порции в службу, чтобы разделить данные, поэтому мне явно не нужно хранить все в памяти ...
Я уже прочитал эти ответы:
Проблема в том, что возвращен базовый поток
[HttpPost]
[Route("api/v1/presentations/{presentationId:int}/documents/{documentId}")]
[ResponseType(typeof(HttpResponseMessage))]
public async Task<HttpResponseMessage> UploadAsync(int presentationId:int, string documentId)
{
// Check if the request contains multipart/form-data.
if (!Request.Content.IsMimeMultipartContent("form-data"))
{
return Request.CreateResponse(HttpStatusCode.UnsupportedMediaType);
}
// Fetch multipart stuffs
var multipartMemoryStreamProvider = await Request.Content.ReadAsMultipartAsync();
// Any content, if any we process
if (multipartMemoryStreamProvider.Contents.Any())
{
// myStrean is actually a ReadOnlyStream wrapping a MemoryStream which wrapped the whole array of buffer...
var myStream = await multipartMemoryStreamProvider.Contents[0].ReadAsStreamAsync();
}
// Other things go here...
}
Оказывается, что если я загружаю файл размером 650 МБ, я могу получить исключение OutOfMemoryException:
System.IO.IOException: Error writing MIME multipart body part to output stream. ---> System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.
Как я могу прочитать файл по частям?
Я думаю об использовании HttpRequest.GetBufferlessInputStream
:
https://docs.microsoft.com/en-us/dotnet/api/system.web.httprequest.getbufferlessinputstream?redirectedfrom=MSDN&view=netframework-4.7.2#System_Web_HttpRequest_GetBufferlessInputStream
Где использовать GetBufferlessInputStream?
... однако, похоже, что он может применяться только ко всему телу http, а не только к данным формы ...