Как разделить файл, загружаемый в действии ASP.NET WebAPI, не сохраняя его полностью в памяти? - PullRequest
0 голосов
/ 02 сентября 2018

У меня есть файл, загружаемый из приложения 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, а не только к данным формы ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...