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

马丁

当我将大文件上传到ASP.NET Core中的Web api时,运行时会在将我的处理和存储上传功能触发之前将文件加载到内存中。对于较大的上载,由于速度慢且需要更多的内存,因此这成为一个问题。对于早期版本的ASP.NET ,有一些文章介绍了如何禁用请求缓冲,但是我找不到关于如何使用ASP.NET Core进行处理的任何信息。是否可以禁用请求缓冲,这样我就不会一直用完服务器上的内存?

肖恩·卢丁(Shaun Luttin)

使用Microsoft.AspNetCore.WebUtilities.MultipartReader因为它...

可以使用最少的缓冲来解析任何流。它一次给您每个节的标题和主体,然后您可以对该节的主体进行所需的操作(缓冲,丢弃,写入磁盘等)。

这是一个中间件示例。

app.Use(async (context, next) =>
{
    if (!IsMultipartContentType(context.Request.ContentType))
    {
        await next();
        return;
    }

    var boundary = GetBoundary(context.Request.ContentType);
    var reader = new MultipartReader(boundary, context.Request.Body);
    var section = await reader.ReadNextSectionAsync();

    while (section != null)
    {
        // process each image
        const int chunkSize = 1024;
        var buffer = new byte[chunkSize];
        var bytesRead = 0;
        var fileName = GetFileName(section.ContentDisposition);

        using (var stream = new FileStream(fileName, FileMode.Append))
        {
            do
            {
                bytesRead = await section.Body.ReadAsync(buffer, 0, buffer.Length);
                stream.Write(buffer, 0, bytesRead);

            } while (bytesRead > 0);
        }

        section = await reader.ReadNextSectionAsync();
    }

    context.Response.WriteAsync("Done.");
});

这是帮手。

private static bool IsMultipartContentType(string contentType)
{
    return 
        !string.IsNullOrEmpty(contentType) &&
        contentType.IndexOf("multipart/", StringComparison.OrdinalIgnoreCase) >= 0;
}

private static string GetBoundary(string contentType)
{
    var elements = contentType.Split(' ');
    var element = elements.Where(entry => entry.StartsWith("boundary=")).First();
    var boundary = element.Substring("boundary=".Length);
    // Remove quotes
    if (boundary.Length >= 2 && boundary[0] == '"' && 
        boundary[boundary.Length - 1] == '"')
    {
        boundary = boundary.Substring(1, boundary.Length - 2);
    }
    return boundary;
}

private string GetFileName(string contentDisposition)
{
    return contentDisposition
        .Split(';')
        .SingleOrDefault(part => part.Contains("filename"))
        .Split('=')
        .Last()
        .Trim('"');
}

外部参考

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

在ASP.NET Core中上传文件

来自分类Dev

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

来自分类Dev

在 ASP.NET Core 中处理 ILoggerFactory

来自分类Dev

处理 ASP Net Core 路由中的“+”

来自分类Dev

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

来自分类Dev

如何上传多个大文件ASP.Net MVC

来自分类Dev

Linux上ASP.Net Core Web API中未处理的异常

来自分类Dev

ASP .NET Core MVC:RedirectToAction上的请求将如何处理

来自分类Dev

ASP.NET Core映射到静态文件处理程序的路由

来自分类Dev

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

来自分类Dev

Asp.Net Core-无法从Dropzone JS上传文件

来自分类Dev

将文件从Angular上传到ASP.NET Core

来自分类Dev

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

来自分类Dev

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

来自分类Dev

ASP.Net Core 1列出给定目录中的文件

来自分类Dev

哪个组件在ASP.NET Core中处理线程分配?

来自分类Dev

ASP .Net Core排队的后台任务并行处理

来自分类Dev

ASP.NET Core Razor-全局异常处理程序

来自分类Dev

处理ASP.NET Core筛选器引发的异常

来自分类Dev

如何在ASP.NET Core中进行异常处理?

来自分类Dev

ASP.Net Core 处理产品价格

来自分类Dev

ASP.Net Core:SSH 客户端的处理

来自分类Dev

asp.net core 3.1流式传输大文件-无法阻止模型绑定

来自分类Dev

.Net Core删除上传的文件

来自分类Dev

使用ASP.NET Core计算SHA1

来自分类Dev

ASP.NET Core社交登录RC1

来自分类Dev

ASP.Net core 1 list files in given directory

来自分类Dev

ASP Net Core 1 RC2 AccountController注入