Как прочитать кусок файла в WebAPI, когда файл большой - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть большой файл, и я хочу отправить его в Web API, который отправит его в Amazon.Поскольку файл большой, я хочу отправить файл в Amazon по частям.Поэтому, если у меня есть файл размером 1 ГБ, я хочу, чтобы мой API получал файл, скажем, 20 МБ, чтобы я мог отправить его в Amazon, а затем снова получить 20 МБ.Как это выполнимо.Ниже моя попытка.

public async Task<bool> Upload()
{
    var fileuploadPath = ConfigurationManager.AppSettings["FileUploadLocation"];
    var provider = new MultipartFormDataStreamProvider(fileuploadPath);
    var content = new StreamContent(HttpContext.Current.Request.GetBufferlessInputStream(true));
    // Now code below writes to a folder, but I want to make sure I read it as soon as I receive some chunk
    await content.ReadAsMultipartAsync(provider);
    return true;
}

Псевдокод:

While (await content.ReadAsMultipartAsync(provider) == 20 MB chunk)
{
  //Do something
  // Then again do something with rest of chunk and so on.
}

Файл размером 1 ГБ.

На данный момент весь файл отправляется по этой строке кода:

await content.ReadAsMultipartAsync(provider);

Я заблудился, пожалуйста, помогите мне.Все, что мне нужно, это получить файл маленьким кусочком и обработать его.

PS: Я отправляю файл как MultiPart / Form-Data от Почтальона для тестирования.

enter image description here

Попытка № 2:

var filesReadToProvider = await Request.Content.ReadAsMultipartAsync();
foreach (var content in filesReadToProvider.Contents)
{
   var stream = await content.ReadAsStreamAsync();
   using (StreamReader sr = new StreamReader(stream))
   {
       string line = "";
       while ((line = sr.ReadLine()) != null)
       {
           using (MemoryStream outputStream = new MemoryStream())
           using (StreamWriter sw = new StreamWriter(outputStream))
           {
               sw.WriteLine(line);
               sw.Flush();
               // Do Something
           }
       }
   }
}

1 Ответ

0 голосов
/ 19 февраля 2019

Нет времени для проверки этого, но метод ReadBlock, кажется, является тем, что вы хотите использовать.Должно выглядеть примерно так, как у меня ниже, но предполагается, что весь ваш другой код хорош, и вам просто нужна помощь с буферизацией.Это «блокирующая» операция чтения, но есть также метод ReadBlockAsync, который возвращает задачу.

const int bufferSize= 1024;
var filesReadToProvider = await Request.Content.ReadAsMultipartAsync();
foreach (var content in filesReadToProvider.Contents)
{
    var stream = await content.ReadAsStreamAsync();
    using (StreamReader sr = new StreamReader(stream))
    {
        int bytesRead;
        char[] buffer = new char[bufferSize];
        while ((bytesRead = sr.ReadBlock(buffer, 0, bufferSize)) > 0)
        {
              // Do something with the first <bytesRead> of buffer and
              // not with <bufferSize> as <bytesRead> will contain the
              // number of bytes actually read by the call to ReadBlock
        }
    }
}
...