Загрузка и загрузка больших файлов ~ 50 ГБ с использованием ASP Core 2.2 API - PullRequest
0 голосов
/ 06 мая 2019

Я изо всех сил пытаюсь обеспечить возможность в моем приложении ASP Core 2.2 загружать и скачивать большие файлы, до 50 ГБ. В настоящее время для целей тестирования я сохраняю файлы в локальном хранилище, но в будущем перенесу их в какой-либо поставщик облачного хранилища.

Файлы будут отправлены другим сервером, написанным на Java, более конкретно, это будет плагин Jenkins, который отправляет сборки проекта на мой сервер ASP Core с использованием Эта библиотека .

В настоящее время я использую классический класс Controller с HttpPost для загрузки файлов, но мне кажется, что это не лучшее решение для моих целей, поскольку я не буду использовать какую-либо веб-страницу для вложения файлов из клиента.

  [HttpPost]
  [RequestFormLimits(MultipartBodyLengthLimit = 50000000000)]
  [RequestSizeLimit(50000000000)]
  [AllowAnonymous]
  [Route("[controller]/upload")]
  public async Task<IActionResult> Upload()
  {
       var files = Request.Form.Files;
       SetProgress(HttpContext.Session, 0);
       long totalBytes = files.Sum(f => f.Length);

       if (!IsMultipartContentType(HttpContext.Request.ContentType))
                return StatusCode(415);

       foreach (IFormFile file in files)
       {
            ContentDispositionHeaderValue contentDispositionHeaderValue =
                    ContentDispositionHeaderValue.Parse(file.ContentDisposition);

            string filename = contentDispositionHeaderValue.FileName.Trim().ToString();

            byte[] buffer = new byte[16 * 1024];

            using (FileStream output = System.IO.File.Create(GetPathAndFilename(filename)))
            {
                using (Stream input = file.OpenReadStream())
                {
                    long totalReadBytes = 0;
                    int readBytes;

                    while ((readBytes = input.Read(buffer, 0, buffer.Length)) > 0)
                    {
                        await output.WriteAsync(buffer, 0, readBytes);
                        totalReadBytes += readBytes;
                        int progress = (int)((float)totalReadBytes / (float)totalBytes * 100.0);
                        SetProgress(HttpContext.Session, progress);

                        Log($"SetProgress: {progress}", @"\LogSet.txt");

                        await Task.Delay(100);
                    }
                }
            }
        }

        return Content("success");

    }

Я сейчас использую этот код для загрузки файлов, но для более крупных файлов> 300 МБ требуется несколько лет, чтобы начать загрузку.

Я пытался найти много статей о том, как этого добиться, например: Официальные документы или же Stack

Но ни одно из решений, похоже, не работает для меня, так как загрузка занимает много времени, и я также заметил, что для файлов ~ 200 МБ (самый большой файл, который я мог загрузить на данный момент), чем больше данных загружено, тем больше мой компьютер работает медленнее.

Мне нужен совет, если я иду по правильному пути или, возможно, мне следует изменить свой подход. Спасибо.

...