鉴于以下代码非常通用,我希望有人可以告诉我一些幕后发生的事情......
[HttpPost]
public ActionResult Load(Guid regionID, HttpPostedFileBase file)
{
if (file.ContentLength == 0)
RedirectToAction("blablabla.....");
var fileBytes = new byte[file.ContentLength];
file.InputStream.Read(fileBytes, 0, file.ContentLength);
}
具体来说,在调用action方法之前,文件是否已完全上传到服务器?或者是file.InputStream.Read()方法调用导致或者更确切地说等待整个文件上载。我可以对流进行部分读取,并在上传时访问文件的“块”吗? (如果在我的方法被调用之前上传了整个火,那么这都是一个没有实际意义的点。)
任何人都可以向我指出一些关于内部运作的好信息。 IIS6或II7在这里有什么区别吗?
谢谢,
答案 0 :(得分:5)
在调用操作方法之前,需要将while文件发送到服务器。引自documentation:
文件以MIME格式上传 multipart / form-data格式。通过 默认,所有请求,包括表单 字段和上传的文件,大于 相反,256 KB被缓冲到磁盘 而不是保存在服务器内存中。
您可以指定允许的最大值 通过访问请求大小 MaxRequestLength属性或由 设置maxRequestLength属性 httpRuntime元素(ASP.NET 设置架构中的元素 Machine.config或Web.config文件。该 默认值为4 MB。
缓冲的数据量 请求的服务器内存, 包括文件上传,可以 通过访问指定 RequestLengthDiskThreshold属性或 通过设置 requestLengthDiskThreshold属性 httpRuntime元素(ASP.NET 设置架构中的元素 Machine.config或Web.config文件。
服务器内存不会在服务器上使用,但文件内容将缓冲到磁盘。一旦客户端发送了整个文件,ASP.NET管道将调用您的控制器操作,您可以以块的形式读取请求流并将其保存到另一个文件,该文件将是上载文件的最终位置。在文件上传完成之前无法调用该操作,因为文件后面的multipart/form-data
中可能还有其他字段,在这种情况下不会分配它们。