2009-07-02 187 views
25

我需要編寫一些報告,然後讓用戶提示將其保存到他/她的本地計算機。最後一次我這樣做,我寫了一個文件到網絡服務器,然後通過Response對象發送給客戶端。C#Asp.net將文件寫入客戶端

創建web服務器上的

TextWriter tw = new StreamWriter(filePath); 

發送到客戶端

page.Response.WriteFile(path); 

的問題是,有沒有辦法跳過物理文件到Web服務器的寫入和右走的時候一個代表響應文檔的對象?

回答

25

您可以使用Response.ContentType這樣

Response.ContentType = "text/plain"; 
Response.OutputStream.Write(buffer, 0, buffer.Length); 
Response.AddHeader("Content-Disposition", "attachment;filename=yourfile.txt"); 

,如果你想要寫一個文本文件,這當然工作。如果你想寫一個.doc文件,例如你將ContentType改爲「application/msword」等等。

16

您可以。

試試這個:

Table oTable = new Table(); 
//Add data to table. 

Response.Clear(); 
Response.Buffer = true; 
Response.ContentType = "application/vnd.ms-excel"; 
Response.AddHeader("Content-Disposition", "attachment;filename="test.xls""); 
Response.Charset = ""; 
this.EnableViewState = false; 
System.IO.StringWriter oStringWriter = new System.IO.StringWriter(); 
System.Web.UI.Html32TextWriter oHtmlTextWriter = new System.Web.UI.Html32TextWriter(oStringWriter); 
0Table.RenderControl(oHtmlTextWriter); 
Response.Write(oStringWriter.ToString()); 
Response.End(); 

這將給提示用戶打開或保存TEST.XLS文件。 同樣,您可以提供其他ASP.NET對象來代替表。

+0

你應該能夠使用Response.Output而不是創建一個StringWriter。 – Talljoe 2009-07-02 07:26:19

+0

我有2個問題。 1)該文件是否可以恢復。和2)如果使用類似IDM等下載管理器,可以實現多種連接。 – shashwat 2013-03-02 18:57:40

+2

@ShashwatTripathi我不確定。這是我長期使用的一段代碼。恕我直言,它不會支持簡歷或多個下載連接。 – 2013-03-02 19:05:59

5

是的。

page.Response.WriteFile(yourData, 0, yourData.Length); 
5

問題的確切答案取決於你如何組織你的報告(即你指的是什麼「對象」)。如果你有一個字符串,你可以使用Response.Write來寫它。如果你需要一個TextWriter,Response.Output就是你想要的 - 這樣你可以跳過寫入磁盤然後使用WriteFile。另外,如果你的內容碰巧是二進制的,你可以使用Response.OutputStream。

如果您希望用戶看到保存文件對話框,您可能還需要設置Response.AddHeader(「Content-Disposition」,「attachment」)。但是,Content-Disposition不一定是可以接受的,所以用戶仍然可以直接在瀏覽器中打開報告。請記住在輸出實際內容之前設置標題!

此外,根據報告的格式,您可能需要將Response.ContentType設置爲適當的內容,例如text/plain,text/csv或其他什麼。正確的MIME類型列於the IANA site