asp.net-mvc - 为什么 HttpPostedFile 没有像宣传的那样执行并将缓冲区下载到磁盘而不是内存?

标签 asp.net-mvc upload httppostedfilebase

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

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

"Files are uploaded in MIME multipart/form-data format. By default, all requests, including form fields and uploaded files, larger than 256 KB are buffered to disk, rather than held in server memory."

我认为这意味着当我访问HttpPostedFileBase时在我的 Controller 中,当我访问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 block 如下所示:

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

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

alt text

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

最佳答案

为什么要这样设置

requestLengthDiskThreshold="2097151"

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

关于asp.net-mvc - 为什么 HttpPostedFile 没有像宣传的那样执行并将缓冲区下载到磁盘而不是内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1147987/

相关文章:

security - 音频文件的数字签名

c# - 对于基本 View 模型属性,HttpPostedFileBase 在 POST 上为 0 字节

c# - ASP MVC 文件上传 HttpPostedFileBase 为空

html - Asp.Net-MVC:如何使用 Css 设置 <%=Html.ActionLink()%> 的样式?

asp.net-mvc - 如何在 View 中相乘

php - 为什么PHP上传的一些图片会自动旋转90度?

ios - 2012 年从 iPhone 媒体库上传文件

c# - ASP.NET Core 请求本地化选项

c# - Log4net 获取日志文本

asp.net-mvc - 模拟 HttpPostedFileBase 和 InputStream 进行单元测试