当前位置:  开发笔记 > 后端 > 正文

将大型文件上传到ASP.NET MVC

如何解决《将大型文件上传到ASP.NETMVC》经验,为你挑选了2个好方法。

对于我正在处理的应用程序,我需要允许用户通过我们的网站上传非常大的文件 - 即可能是几千兆字节.不幸的是,ASP.NET MVC似乎在开始服务之前将整个请求加载到RAM中 - 对于这样的应用程序来说并不完全理想.值得注意的是,尝试通过以下代码来规避问题:

if (request.Method == "POST")
{
    request.ContentLength = clientRequest.InputStream.Length;
    var rgbBody = new byte[32768];

    using (var requestStream = request.GetRequestStream())
    {
        int cbRead;
        while ((cbRead = clientRequest.InputStream.Read(rgbBody, 0, rgbBody.Length)) > 0)
        {
            fileStream.Write(rgbBody, 0, cbRead);
        }
    }
}

无法绕过缓冲区请求到RAM的心态.有没有一种简单的方法来解决这种行为?



1> Benjamin Pol..:

事实证明我的初始代码基本上是正确的; 唯一需要改变的是改变

request.ContentLength = clientRequest.InputStream.Length;

request.ContentLength = clientRequest.ContentLength;

前者在整个请求流中确定内容长度; 后者只检查Content-Length标题,只需要标题已完整发送.这允许IIS几乎立即开始流式传输请求,这完全消除了原始问题.


并不是说我已经能够确定,但是一旦我找到了有效的东西,我就停止认真调查这个问题.

2> RedFilter..:

当然,你可以做到这一点.请参阅使用HttpWebRequest和IHttpHandler的RESTful文件上载.我已经使用这种方法几年了,并且已经使用至少几千兆字节的文件测试了一个站点.基本上,您想要创建自己的IHttpHandler,这比听起来更容易.

简而言之,您创建了一个实现IHttpHandler接口的类,这意味着您必须支持IsReusable属性和ProcessRequest方法.最重要的是,你的web.config有一个小的改动,它就像一个魅力.在请求生命周期的这个阶段,上传的整个文件不会被加载到内存中,因此它可以巧妙地解决内存不足问题.

请注意,在web.config中,


 

引用的文件DocumentUploadService.upl实际上并不存在.这就是提供备用扩展,以便标准处理程序不会截获请求.您将文件上载表单指向该路径,但随后您的FileUploadHandler类启动并实际接收该文件.

更新:实际上,我使用的代码与那篇文章不同,我想我偶然发现了它的工作原因.我使用HttpPostedFile类,其中"文件以MIME多部分/表格数据格式上传.默认情况下,大于256 KB的所有请求(包括表单字段和上载文件)都缓冲到磁盘,而不是保存在服务器内存中. "

if (context.Request.Files.Count > 0)
{
    string tempFile = context.Request.PhysicalApplicationPath;
    for(int i = 0; i < context.Request.Files.Count; i++)
    {
        HttpPostedFile uploadFile = context.Request.Files[i];
        if (uploadFile.ContentLength > 0)
        {
            uploadFile.SaveAs(string.Format("{0}{1}{2}",
              tempFile,"Upload\\", uploadFile.FileName));
        }
    }
}

推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有