2012-01-10 83 views
6

當上一個MVC3網站使用標準<input type="file" />,你可以通過創建HttpPostedFile類型的輸入參數和表格設置爲enctype="multipart/form-data"Asp.Net高級文件上傳

的問題之一收到您的操作方法的文件這種方法的缺點是,請求沒有完成,並且在文件的全部內容上傳之前不會傳遞給您的操作方法。

我想在上傳到服務器時對該文件做一些操作。基本上我想異步接收數據,然後以編程方式逐字節地處理數據。

爲了達到上述目的,我想你可能需要在HttpModule或自定義HttpHandler中處理這部分請求。我很熟悉這些工作是如何工作的,但是我不熟悉接收文件上傳數據的方法。

我知道這是可能的,因爲我在過去一直使用第三方組件這樣做(通常這樣他們可以報告上傳進度,或將數據緩存到磁盤以避免iis/asp.net內存限制)。不幸的是,我使用的所有組件都是封閉源代碼,所以我不能偷看內部,看看他們在做什麼。

我不是在尋找代碼,但是有人能讓我指出正確的方向嗎?

+0

你看過把請求傳遞給WCF服務嗎? – Lloyd 2012-01-10 23:28:45

+0

看看[Jon Galloway的帖子](http://weblogs.asp.net/jgalloway/archive/2008/01/08/large-file-uploads-in-asp-net.aspx),它可能會指出你在正確的方向(特別是他提到[NeatUpload](http://neatupload.codeplex.com/)看起來很有前途)。 – staterium 2012-02-11 21:11:48

回答

1

使用WCF服務,您可以向您的服務和從您的服務發送文件流。

下面是服務端接收代碼我使用:

int chunkSize = 2048; 
byte[] buffer = new byte[chunkSize]; 

using (System.IO.FileStream writeStream = 
    new System.IO.FileStream(file.FullName, System.IO.FileMode.CreateNew, System.IO.FileAccess.Write)) 
{ 
    do 
    { 
     // read bytes from input stream 
     int bytesRead = request.FileByteStream.Read(buffer, 0, chunkSize); 
     if (bytesRead == 0) break; 

     // write bytes to output stream 
     writeStream.Write(buffer, 0, bytesRead); 
    } while (true); 

    writeStream.Close(); 
} 

如果看起來像你想要什麼,看看CodeProject上File Transfer Progress。它涉及到很多細節,我的代碼是基於鬆散的。

+0

這可以用來從Web瀏覽器上傳多部分表單嗎? – StriplingWarrior 2012-01-11 00:22:09

+0

儘管這很有趣,我很欣賞這篇文章的發佈時間,但它似乎不適用於使用multipart/form-data發送的文件數據(例如:來自典型的html表單)。 – Erick 2012-01-30 20:25:59

+0

好的,對不起,我在我的上傳/下載代碼中使用它來上傳多個文件並使用進度條(到客戶端程序,而不是另一個網頁)。 – 2012-01-30 20:29:12