2009-05-22 24 views
5

Tôi muốn tạo tệp văn bản để xuất/tải xuống, như * .csv, từ một ứng dụng ASP.NET. Tôi biết về Response.TransmitFile, nhưng tôi muốn làm điều này mà không cần tạo và lưu tệp trên máy chủ. Điều đó có thể không? Có ai đã làm điều gì đó như thế không?Trong ASP.NET, làm cách nào để trình duyệt tải xuống nội dung chuỗi thành một tệp? (C#)

+0

bạn có thể cụ thể hơn một chút không? Bạn có nghĩa là bạn muốn lấy một chuỗi và lưu nó vào một tập tin trên máy khách và không bao giờ tạo một tập tin trên máy chủ? –

Trả lời

1

Tệp bạn chưa lưu chỉ là biến chuỗi hoặc MemoryStream. Nhưng đối với một lượng lớn dữ liệu bạn có thể không muốn giữ tất cả trong bộ nhớ. Bạn muốn làm gì với "tệp" này sau khi đã có?

+0

Tôi muốn tải xuống số –

13

Khi bạn nói "Tạo tệp để xuất", tôi hiểu rằng bạn muốn làm cho tệp có thể tải xuống trình duyệt. Nếu đúng như vậy, đây là một ví dụ.

public void btnGo_Click (Object sender, EventArgs e) 
{ 
    Response.Clear(); 

    string fileName= String.Format("data-{0}.csv", DateTime.Now.ToString("yyyy-MMM-dd-HHmmss")); 
    Response.ContentType = "text/csv"; 
    Response.AddHeader("content-disposition", "filename=" + fileName); 

    // write string data to Response.OutputStream here 
    Response.Write("aaa,bbb,ccc\n"); 

    Response.End(); 
} 

trích dẫn: RFC 4180

+0

Tôi cho rằng bạn có ý định rằng điều này được đặt trong một trang ASPX bình thường? Điều đó sẽ làm việc, tất nhiên, nhưng không thực sự tối ưu. Sẽ có một số chi phí cho việc khởi tạo/bắt đầu để tạo trang ASPX khi bắt đầu. – Noldorin

+0

có, điều này sẽ đi vào một trang "bình thường" ASPX. Bạn không chắc chắn những gì bạn có nghĩa là bằng cách trên không, hoặc lý do tại sao những gì tôi có ở đây là phụ tối ưu. – Cheeso

+0

Vâng, một ASHX sẽ làm tốt công việc. Tôi đã đề xuất một trình xử lý HTTP tùy chỉnh, nhưng có thể hoạt động tốt ở đây. – Noldorin

1

Bạn có thể viết direcly đến Response.OutputStream và thiết lập các kiểu nội dung đúng, và tiêu đề bố trí nội dung.

0

Ồ, điều đó không tệ. Trong trang Page_Load của ASPX của bạn thực hiện điều này:

Response.ContentType = "text/xml"; 
Response.ContentEncoding = System.Text.Encoding.UTF8; 
Response.Write(/* your text goes here */); 

Ở trên là ví dụ nếu tệp 'của bạn' là xml, nhưng có thể là bất kỳ thứ gì, từ và xuất ra tệp pdf. Tất cả những gì bạn phải làm là cập nhật ContentType mà bạn có thể tra cứu qua Google hoặc Trực tiếp.

+0

wow bạn mọi người đang nhanh chóng ... =) – JasonRShaver

0

Hãy thử mẫu này:

protected void Button1_Click(object sender, EventArgs e) 
{ 
    Response.ContentType = "text/csv"; 
    Response.AddHeader("content-disposition", "attachment; filename=download.csv"); 
    Response.Write("your,csv,file,contents"); 
    Response.End(); 
} 
4

Bạn sẽ muốn nhìn vào viết một Tuỳ chỉnh HTTP Handler (một lớp mà thực hiện IHttpHandler) và chỉ cần đăng ký nó trong web.config. Xem this article on MSDN để có ví dụ điển hình về cách thiết lập.

Dưới đây là ví dụ cơ bản về cách bạn có thể thực hiện một cách để trả lại đánh dấu cho một số dữ liệu CSV.

using System.Web; 

public class MyCsvDocumentHandler : IHttpHandler 
{ 
    public static string Data 
    { 
     get; 
     set; 
    } 

    public MyCsvDocumentHandler() 
    { 
    } 

    public void ProcessRequest(HttpContext context) 
    { 
     context.Response.ContentType = "text/csv"; // Set the MIME type. 
     context.Response.Write(Data); // Write the CSV data to the respone stream. 
    } 

    public bool IsReusable 
    { 
     // To enable pooling, return true here. 
     // This keeps the handler in memory. 
     get { return false; } 
    } 
} 

Phương án này có thể đơn giản hơn một chút là sử dụng trang ASHX handler. Mã sẽ gần như giống hệt nhau.

+0

Lưu ý rằng nó cũng có thể (nếu không có tài liệu) để liên kết một IHTTPHandler mà không cần nhấn mạnh trang web của bạn.config - loại trang "ASHX" cung cấp hệ thống dây điện cho bạn. –

+1

(Tôi đã sử dụng kỹ thuật này để tạo các nút đồ họa động trong quá khứ, tôi nghĩ nó khá hữu ích). –

+0

@Tetsujin: Vâng, tuyệt đối. Trong một số trường hợp, trình xử lý HTTP (IHttpHandler) là hấp dẫn hơn, vì nó cung cấp sự linh hoạt hơn một chút, nhưng một ASHX sẽ tốt như thế trong trường hợp này. – Noldorin

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