使用ASP Core 2.2 API上传和下载〜50gb的大文件

时间:2019-05-06 08:47:55

标签: asp.net-core download upload file-transfer asp.net-core-2.2

我正努力在ASP Core 2.2应用程序中提供上传和下载大文件(最大50GB)的功能。目前,出于测试目的,我将文件保存在本地存储中,但将来,我会将其移至某个云存储提供商。

文件将由其他用Java编写的服务器发送,更具体地说,它将是Jenkins插件,该插件使用This library将项目构建发送到我的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");

    }

我现在正在使用此代码上传文件,但对于大于300mb的较大文件,开始上传文件需要一段时间。

我尝试查找有关如何实现此目标的许多文章,例如: Official docs 要么 Stack

但是,由于上载需要很长时间,因此所有解决方案似乎都不适合我,而且我还注意到,对于〜200MB(目前我可以上载的最大文件)的文件,上载的数据越多,我的PC速度就越慢。 / p>

如果我遵循正确的道路,或者我应该改变方法,我需要一些建议。谢谢。

0 个答案:

没有答案