在ASP.NET Core 3.1中上传和下载大文件?

阿斯皮安

我正在使用干净的体系结构开发ASP.NET Core 3.1 API项目,并且具有以下类库(层):

  • 基础架构(安全性和上载助手等)
  • 持久性(DA层)
  • 域(域模型)
  • 应用程序(用例-业务逻辑)
  • API(API项目作为我的启动项目)

我希望能够将较大的文件上传到服务器(例如2Gb甚至更大的文件大小),然后再下载,并希望以后不会出现内存溢出和其他所有问题。

任何帮助,将不胜感激。

曼努埃尔·阿伦斯帕奇

如果文件太大,则不要使用byte[]MemoryStream在代码中使用。如果您下载/上传文件,则仅在流上操作。

您有两种选择:

  • 如果同时控制客户端和服务器,请考虑使用类似tus的工具.NET有客户端和服务器实现。这可能是最简单,最可靠的选择。
  • 如果使用HttpClient上传大文件,只需使用StreamContent该类发送它们。再说一次,不要使用MemoryStreamas作为源,而是使用其他源FileStream
  • 如果使用HttpClient下载大文件,则指定HttpCompletionOptions很重要,例如var response = await httpClient.SendAsync(httpRequest, HttpCompletionOption.ResponseHeadersRead)否则,HttpClient会将整个响应缓冲在内存中。然后,您可以通过将响应文件作为流处理var stream = response.Content.ReadAsStreamAsync()

ASP.NET Core特定建议:

  • 如果要通过HTTP POST接收文件,则需要增加请求的大小限制:[RequestSizeLimit(10L * 1024L * 1024L * 1024L)][RequestFormLimits(MultipartBodyLengthLimit = 10L * 1024L * 1024L * 1024L)]另外,您需要禁用表单值绑定,否则整个请求将被缓冲到内存中:
   [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
   public class DisableFormValueModelBindingAttribute : Attribute, IResourceFilter
   {
       public void OnResourceExecuting(ResourceExecutingContext context)
       {
           var factories = context.ValueProviderFactories;
           factories.RemoveType<FormValueProviderFactory>();
           factories.RemoveType<FormFileValueProviderFactory>();
           factories.RemoveType<JQueryFormValueProviderFactory>();
       }

       public void OnResourceExecuted(ResourceExecutedContext context)
       {
       }
   }
  • 要从控制器返回文件,只需通过File接受流方法简单地将其返回return File(stream, mimeType, fileName);

一个示例控制器如下所示(有关缺少的帮助程序类,请参见https://docs.microsoft.com/zh-cn/aspnet/core/mvc/models/file-uploads?view=aspnetcore-3.1):

private const MaxFileSize = 10L * 1024L * 1024L * 1024L; // 10GB, adjust to your need

[DisableFormValueModelBinding]
[RequestSizeLimit(MaxFileSize)]
[RequestFormLimits(MultipartBodyLengthLimit = MaxFileSize)]
public async Task ReceiveFile()
{
    if (!MultipartRequestHelper.IsMultipartContentType(Request.ContentType))
        throw new BadRequestException("Not a multipart request");

    var boundary = MultipartRequestHelper.GetBoundary(MediaTypeHeaderValue.Parse(Request.ContentType));
    var reader = new MultipartReader(boundary, Request.Body);

    // note: this is for a single file, you could also process multiple files
    var section = await reader.ReadNextSectionAsync();

    if (section == null)
        throw new BadRequestException("No sections in multipart defined");

    if (!ContentDispositionHeaderValue.TryParse(section.ContentDisposition, out var contentDisposition))
        throw new BadRequestException("No content disposition in multipart defined");

    var fileName = contentDisposition.FileNameStar.ToString();
    if (string.IsNullOrEmpty(fileName))
    {
        fileName = contentDisposition.FileName.ToString();
    }

    if (string.IsNullOrEmpty(fileName))
        throw new BadRequestException("No filename defined.");

    using var fileStream = section.Body;
    await SendFileSomewhere(fileStream);
}

// This should probably not be inside the controller class
private async Task SendFileSomewhere(Stream stream)
{
    using var request = new HttpRequestMessage()
    {
        Method = HttpMethod.Post,
        RequestUri = new Uri("YOUR_DESTINATION_URI"),
        Content = new StreamContent(stream),
    };
    using var response = await _httpClient.SendAsync(request);
    // TODO check response status etc.
}

在此示例中,我们将整个文件流式传输到另一个服务。在某些情况下,最好将文件临时保存到磁盘。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在ASP.NET Core中上传文件

来自分类Dev

在ASP.NET Core中上传文件图像

来自分类Dev

使用 MongoDb 在 Asp.NET Core 中上传文件

来自分类Dev

处理ASP.NET Core 1.0上的大文件上传

来自分类Dev

共享cookie .net Core 3和Asp.net

来自分类Dev

.NET Standard和.NET Core 3.x或ASP.NET Core 3.x

来自分类Dev

大文件无法在ASP.NET中上传

来自分类Dev

ASP.NET Core 3 ActionFilter和Viewbag

来自分类Dev

在asp.net core 3中创建漂亮的url

来自分类Dev

覆盖ASP.NET Core 3中的授权策略

来自分类Dev

无法在Asp.Net Core中上传图片

来自分类Dev

ASP.NET Core 2 razor 页面中的文件上传

来自分类Dev

Asp Net core 3的配置是否与Asp Net core 3无关?

来自分类Dev

如何在ASP.NET Core 3中解析本地文件路径?

来自分类Dev

ASP.NET Core 3中的app.UseOpenIdConnectAuthentication()和OpenIdConnectMiddleware在哪里?

来自分类Dev

增加 ASP.NET Core API 的最大文件大小

来自分类Dev

在asp.net MVC中上传大文件时,出现HTTP错误404.13-未找到

来自分类Dev

asp .net 和 asp .net core 有什么区别?

来自分类Dev

在ASP.NET MVC 6中上传文件

来自分类Dev

无法在 ASP.NET Core 中使用 D3 加载 .geojson 文件

来自分类Dev

ASP.NET Core 3和500.30进程内启动失败

来自分类Dev

ASP Net Core 3会话(状态)并发性和完整性

来自分类Dev

ASP.NET Core 3 MVC端点路由和按路由进行本地化

来自分类Dev

查看在Asp.Net Core 3中的控制器中找不到动作

来自分类Dev

如何从ASP.NET Core 3.1中的EntityFrameworkCore 3中删除依赖项

来自分类Dev

如何处理ASP.NET Core 3中400到500的异常

来自分类Dev

自定义AuthenticationHandler在Asp.Net Core 3中不起作用

来自分类Dev

JsonIgnore属性保留ASP.NET Core 3中的序列化属性

来自分类Dev

带有JSON参数的HttpPost在ASP.NET Core 3中不起作用

Related 相关文章

  1. 1

    在ASP.NET Core中上传文件

  2. 2

    在ASP.NET Core中上传文件图像

  3. 3

    使用 MongoDb 在 Asp.NET Core 中上传文件

  4. 4

    处理ASP.NET Core 1.0上的大文件上传

  5. 5

    共享cookie .net Core 3和Asp.net

  6. 6

    .NET Standard和.NET Core 3.x或ASP.NET Core 3.x

  7. 7

    大文件无法在ASP.NET中上传

  8. 8

    ASP.NET Core 3 ActionFilter和Viewbag

  9. 9

    在asp.net core 3中创建漂亮的url

  10. 10

    覆盖ASP.NET Core 3中的授权策略

  11. 11

    无法在Asp.Net Core中上传图片

  12. 12

    ASP.NET Core 2 razor 页面中的文件上传

  13. 13

    Asp Net core 3的配置是否与Asp Net core 3无关?

  14. 14

    如何在ASP.NET Core 3中解析本地文件路径?

  15. 15

    ASP.NET Core 3中的app.UseOpenIdConnectAuthentication()和OpenIdConnectMiddleware在哪里?

  16. 16

    增加 ASP.NET Core API 的最大文件大小

  17. 17

    在asp.net MVC中上传大文件时,出现HTTP错误404.13-未找到

  18. 18

    asp .net 和 asp .net core 有什么区别?

  19. 19

    在ASP.NET MVC 6中上传文件

  20. 20

    无法在 ASP.NET Core 中使用 D3 加载 .geojson 文件

  21. 21

    ASP.NET Core 3和500.30进程内启动失败

  22. 22

    ASP Net Core 3会话(状态)并发性和完整性

  23. 23

    ASP.NET Core 3 MVC端点路由和按路由进行本地化

  24. 24

    查看在Asp.Net Core 3中的控制器中找不到动作

  25. 25

    如何从ASP.NET Core 3.1中的EntityFrameworkCore 3中删除依赖项

  26. 26

    如何处理ASP.NET Core 3中400到500的异常

  27. 27

    自定义AuthenticationHandler在Asp.Net Core 3中不起作用

  28. 28

    JsonIgnore属性保留ASP.NET Core 3中的序列化属性

  29. 29

    带有JSON参数的HttpPost在ASP.NET Core 3中不起作用

热门标签

归档