5

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

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

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

我假设这意味着当我HttpPostedFileBase在我的控制器中访问时,当我访问HttpPostedFileBase'InputStream属性时,我可以将文件缓冲区写入某处,而不必担心服务器内存不足,这显然是一个不可行的解决方案。

下面是一些伪代码,说明我如何处理来自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);
}

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

<httpRuntime
  executionTimeout="1200"
  requestLengthDiskThreshold="2097151"
  maxRequestLength="2097151"
  useFullyQualifiedRedirectUrl="false"
  minFreeThreads="8"
  minLocalRequestFreeThreads="4"
  appRequestQueueLimit="100" />

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

替代文字

我知道我可以使用 Flash/Silverlight 小部件或编写自定义来拦截上传并自己处理它们,但如果按照MSDN 所说的(或者我做错了)HttpModule,当前的要求将完美地工作。HttpPostedFile

4

1 回答 1

5

你为什么设置

requestLengthDiskThreshold="2097151"

在配置中?这不会强制服务器将所有上传内容保存在 RAM 中而不是缓冲到磁盘中吗?

于 2009-07-18T18:17:10.557 回答