2009-07-02 35 views
25

Tôi cần viết một số báo cáo và sau đó yêu cầu người dùng nhắc lưu nó vào máy cục bộ của mình. Lần cuối cùng tôi đã làm điều này tôi đã viết một tập tin vào máy chủ web và sau đó gửi nó cho khách hàng thông qua đối tượng Response.C# Asp.net ghi tập tin cho khách hàng

để tạo ra trên máy chủ web

TextWriter tw = new StreamWriter(filePath); 

để gửi cho khách hàng

page.Response.WriteFile(path); 

Câu hỏi đặt ra là, Có cách nào để bỏ qua các văn bản của các tập tin vật lý vào máy chủ web và đi ngay từ một đối tượng đại diện cho tài liệu cho phản hồi?

Trả lời

25

Bạn có thể sử dụng Response.ContentType như thế này

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

Điều này tất nhiên hoạt động nếu bạn muốn viết một tập tin văn bản. Trong trường hợp bạn muốn viết .doc ví dụ bạn thay đổi ContentType thành "application/msword", v.v ...

+0

mã này viết ghi vào trình duyệt của tôi. Tôi không nhận được lời nhắc. IReport rpt = new ContxReport(); string report = rpt.makeReport(); Mã hóa ASCIIEncoding = new ASCIIEncoding(); byte [] encodedReport = encoding.GetBytes (báo cáo); Trả lời.ContentType = "text/plain"; Response.OutputStream.Write (encodedReport, 0, encodedReport.Length); Response.AddHeader ("Content-Disposition", "inline; filename = shit.csv"); Response.End(); – jim

+1

Ngoài ra, bạn nên đặt tất cả các tiêu đề trước khi viết. – Talljoe

+1

*** bộ đệm *** là gì? – Kiquenet

16

Bạn có thể.

Hãy thử điều này:

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(); 

này sẽ cung cấp nhắc nhở người dùng mở hoặc lưu tập tin test.xls. tương tự bạn có thể cung cấp các đối tượng ASP.NET khác thay cho Bảng.

+0

Bạn sẽ có thể sử dụng Response.Output thay vì tạo StringWriter. – Talljoe

+0

Tôi có 2 câu hỏi. 1) Tập tin đó có tiếp tục có khả năng không? và 2) Có thể kết nối nhiều lần nếu sử dụng trình quản lý tải xuống như IDM v.v. không? – shashwat

+2

@ShashwatTripathi Tôi không chắc chắn. Đây là một đoạn mã tôi đã sử dụng từ lâu. IMHO, nó sẽ không hỗ trợ tiếp tục hoặc nhiều kết nối tải xuống. –

5

Có.

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

Tôi có 2 câu hỏi. 1) Tập tin đó có tiếp tục có khả năng không? và 2) Có thể kết nối nhiều lần nếu sử dụng trình quản lý tải xuống như IDM v.v. không? – shashwat

5

Câu trả lời chính xác cho câu hỏi phụ thuộc vào cách bạn tổ chức báo cáo (tức là "đối tượng" bạn đang đề cập đến). Nếu bạn có một chuỗi, bạn có thể sử dụng Response.Write để viết nó. Nếu bạn cần một TextWriter, Response.Output là những gì bạn muốn - theo cách đó bạn có thể bỏ qua việc ghi vào đĩa và sau đó sử dụng WriteFile. Ngoài ra, nếu nội dung của bạn đã xảy ra là nhị phân, bạn có thể sử dụng Response.OutputStream cho điều đó.

Bạn cũng có thể muốn đặt Response.AddHeader ("Content-Disposition", "attachment"), nếu bạn muốn người dùng nhìn thấy hộp thoại lưu tệp. Tuy nhiên, Nội dung-Bố trí không nhất thiết phải được vinh danh, do đó người dùng vẫn có thể nhận được báo cáo được mở trực tiếp trong trình duyệt. Hãy nhớ đặt tiêu đề trước khi bạn xuất nội dung thực tế!

Ngoài ra, tùy thuộc vào định dạng của báo cáo, bạn có thể muốn đặt Response.ContentType thành nội dung nào đó thích hợp như văn bản/văn bản, văn bản/csv hoặc bất kỳ điều gì có bạn. Các loại mime chính xác được liệt kê tại the IANA site.

Các vấn đề liên quan