我正在使用<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