標籤:style blog http io ar color os 使用 sp
需求:點擊SAVE,去ajax去後台下載檔案,完成後出現儲存對話方塊,然後直接下載.
解決方案:下載完成後用JS轉到向到另一個頁面,在這頁面Page_Load裡用C#Response對象直接下載.
下載實現代碼
private void DownFile() { try { long lngFileSize; byte[] bytBuffer; int iReading; string sFileName = Server.MapPath("TextFile.txt"); Stream outStream = Response.OutputStream;//get output stream //set htttp header Response.ContentType = "application/Zip"; Response.AppendHeader("Connection", "close"); Response.AppendHeader("Content-Disposition", " attachment; filename = ItemMarc.txt");//default file name when download FileStream fStream = new FileStream(sFileName, FileMode.OpenOrCreate, FileAccess.Read); lngFileSize = fStream.Length; bytBuffer = new byte[(int)lngFileSize]; while ((iReading = fStream.Read(bytBuffer, 0, (int)lngFileSize)) > 0) { outStream.Write(bytBuffer, 0, iReading); } fStream.Close(); outStream.Close(); Response.End(); } catch (Exception ex) { throw ex; } }
解釋:1.Response.ContentType = "application/Zip";
Content-Type是返回訊息中非常重要的內容,它標識出這個返回內容的類型,其值為“主類型/子類型”的格式,例如最常見的就是text /html,它的意思是說返回的內容是文本類型,這個文本又是HTML格式的。原則上瀏覽器會根據Content-Type來決定如何顯示返回的訊息體內 容。常見的內容類型有:
text/html HTML文本
image/jpeg JPG圖片
image/gif GIF圖片
application/xml XML文檔
audio/x-mpegurl MP3檔案清單,如果安裝了Winamp,則可以直接把它當面M3U檔案來開啟
2.Response.AppendHeader("Connection", "close");
在http1.1中request和reponse header中都有可能出現一個connection的頭,此header的含義是當client和server通訊時對於長連結如何進行處理。
在http1.1中,client和server都是預設對方支援長連結的, 如果client使用http1.1協議,但又不希望使用長連結,則需要在header中指明connection的值為close;如果server方 也不想支援長連結,則在response中也需要明確說明connection的值為close.
不論request還是response的header中包含了值為close的connection,都表明當前正在使用的tcp連結在當天請求處理完畢後會被斷掉。以後client再進行新的請求時就必須建立新的tcp連結了。
3. Response.AppendHeader("Content-Disposition", " attachment; filename = ItemMarc.txt");
Content-Disposition:如果用AddHeader的方法在HTTP訊息頭中加入Content-Disposition段,並指定其值為“attachment”,那麼無論這個檔案是何類型,瀏覽器都會提示我們下載此檔案,因為此時它認為後面的訊息體是一個“附件”,不需要由瀏覽器來處理了。通過AddHeader函數可以為HTTP訊息頭加入我們自訂的內容。使用這種方法可以強制讓瀏覽器提示下載檔案,即使這個檔案是我們已知的類型,基於 是HTML網頁。如果想要讓使用者下載時提示一個預設的檔案名稱,只需要在前面一句話後加上“filename=檔案名稱”即可。
如果把Content-Type和Content-Disposition結合在一起使用會怎麼樣呢?
開啟一個網頁時,瀏覽器會首先看是否有Content-Disposition: attachment這一項,如果有,無論Content-Type的值是什麼,都會提示檔案下載。
如果指定了filename,就會提示預設的檔案名稱為此檔案名稱。
4.Response.End();將緩衝輸出到用戶端,實際現象,如果沒有這一句,那麼會將預設的所有HTML內容也一起返回到伺服器.
【轉】c#實現檔案下載