2010-09-15 95 views
3

考慮下面的代碼,這是非常通用的,我希望有人能告訴我一些關於到底是怎麼回事幕後...IIS asp.net mvc偏?文件上傳

[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); 
} 

具體而言,完全是上傳到服務器上的文件在我的操作方法被調用之前?或者它是導致或者等待整個文件上傳的file.InputStream.Read()方法調用。我可以在流上進行部分讀取,並可以在文件上傳時訪問文件的「塊」嗎? (如果在我的方法被調用之前上傳了整個火焰,那麼這是一個沒有爭議的問題。)

任何人都可以點我一些關於這裏的內部工作的很好的信息。這裏有沒有IIS6或II7的區別?

感謝,

回答

5

的同時,文件需要被調用的操作方法之前被髮送到服務器。引自documentation

文件上傳到MIME multipart/form-data格式。默認情況下,所有請求(包括表格 字段和上傳的文件,大於 256 KB)都會緩存到磁盤,而不是保存在服務器內存中的 。

可以通過訪問 maxRequestLength的屬性或由 設置了maxRequestLength指定最大允許 請求大小屬性httpRuntime元素(ASP.NET 設置架構)元件的 的 的Machine.config或Web.config中內文件。 默認值是4 MB。

了在 服務器存儲器緩衝以用於一個請求,該請求 包括文件上傳的數據量,可以通過設置httpRuntime元素的 requestLengthDiskThreshold屬性 訪問 RequestLengthDiskThreshold屬性或 可以 指定(ASP .NET 設置架構) Machine.config或Web.config文件中的元素。

服務器內存不會在服務器上消耗,但文件內容將被緩衝到磁盤。一旦客戶端發送了整個文件,ASP.NET管道將調用您的控制器操作,並且您可以以塊讀取請求流並將其保存到另一個文件,該文件將成爲上傳文件的確切位置。在文件上傳完成之前無法調用該動作,因爲multipart/form-data中可能有一些其他字段位於文件之後,因此在這種情況下不會分配它們。