为什么HttpPostedFile不像广告和缓冲区下载到磁盘而不是内存?

Dan*_*nna 5 asp.net-mvc upload httppostedfilebase

我使用标准HTML <input>控件发布多部分表单数据将大文件上载到ASP.NET服务器.这是一个ASP.NET MVC应用程序.

根据MSDN,HttpPostedFile该类缓冲到磁盘开箱即用:

"文件以MIME multipart/form-data格式上传.默认情况下,大于256 KB的所有请求(包括表单字段和上传文件)都缓冲到磁盘,而不是保存在服务器内存中."

我想这意味着,当我访问HttpPostedFileBase我的控制器,当我访问HttpPostedFileBaseInputStream财产,我可以写某个文件缓冲区,而不必担心运行内存的服务器,这显然是一个不可行的解决方案.

这里有一些关于我如何处理每个传入文件的伪代码HttpPostedFileBase.

for(var i = 0; i< Request.Files.Count;i++)
{
    var fileBase = Request.Files[i];
    if (fileBase.ContentLength == 0)
    {
        continue;
    }

    // One thread per file
    ThreadPool.QueueUserWorkItem(state =>
    {
        // Read from fileBase.InputStream
    }, 
    null);
}
Run Code Online (Sandbox Code Playgroud)

我的web.config的httpRuntime块如下所示:

<httpRuntime
  executionTimeout="1200"
  requestLengthDiskThreshold="2097151"
  maxRequestLength="2097151"
  useFullyQualifiedRedirectUrl="false"
  minFreeThreads="8"
  minLocalRequestFreeThreads="4"
  appRequestQueueLimit="100" />
Run Code Online (Sandbox Code Playgroud)

我的实现工作,多个文件按预期上传,除了服务器消耗缓冲整个有效负载所需的相同内存量.我必须假设InputStream正在缓冲所有内容.当我上传的文件多于我的内存时,它可以预测会崩溃OutOfMemoryException.这是上传800mb文件时内存峰值的图像.

替代文字

我知道我可以使用Flash/Silverlight小部件或编写自定义HttpModule来截取上传并自己处理它们,但是如果HttpPostedFileMSDN说它做了什么(或者我做错了),当前的要求将完美无缺.

chr*_*166 5

你为什么这么做

requestLengthDiskThreshold="2097151"
Run Code Online (Sandbox Code Playgroud)

在配置?这是否强制服务器将所有上载保留在RAM而不是缓冲到磁盘?