我使用标准HTML <input>
控件发布多部分表单数据将大文件上传到ASP.NET服务器。这是一个ASP.NET MVC应用程序。
根据MSDN,HttpPostedFile
类缓存到磁盘开箱即用:
“文件以MIME格式上传 multipart / form-data格式。通过 默认,所有请求,包括表单 字段和上传的文件,大于 相反,256 KB被缓冲到磁盘 而不是保存在服务器内存中。“
我认为这意味着当我在我的控制器中访问HttpPostedFileBase
时,当我访问HttpPostedFileBase
的{{1}}属性时,我可以在某处编写文件缓冲区而不必担心关于服务器内存不足的问题,这显然是一种不可行的解决方案。
这里有一些关于我如何处理来自InputStream
的每个传入文件的伪代码。
HttpPostedFileBase
我的web.config的httpRuntime块如下所示:
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);
}
我的实现工作正常,多个文件按预期上传,但服务器消耗了缓冲整个有效负载所需的相同内存量。我必须假设InputStream正在缓冲所有内容。当我上传的文件多于我的内存时,它可以预测会因<httpRuntime
executionTimeout="1200"
requestLengthDiskThreshold="2097151"
maxRequestLength="2097151"
useFullyQualifiedRedirectUrl="false"
minFreeThreads="8"
minLocalRequestFreeThreads="4"
appRequestQueueLimit="100" />
而崩溃。这是上传800mb文件时内存峰值的图像。
我知道我可以使用Flash / Silverlight小部件或编写自定义OutOfMemoryException
来截取上传并自行处理它们,但如果HttpModule
做了MSDN所说的那样,那么当前的要求会完美无缺(或者我做错了。)
答案 0 :(得分:5)
为什么要设置
requestLengthDiskThreshold="2097151"
在配置中?这是否会强制服务器将所有上载保留在RAM而不是缓冲到磁盘?