我正在使用标准 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 文件时内存峰值的图像。
我知道我可以使用 Flash/Silverlight 小部件或编写自定义 HttpModule
拦截上传并自己处理它们,但如果HttpPostedFile
,当前的要求将完美地工作做了 MSDN 所说的事情(或者我做错了)。
最佳答案
为什么要这样设置
requestLengthDiskThreshold="2097151"
在配置中?这是否会强制服务器将所有上传内容保存在 RAM 中而不是缓冲到磁盘?
关于asp.net-mvc - 为什么 HttpPostedFile 没有像宣传的那样执行并将缓冲区下载到磁盘而不是内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1147987/