2008-09-16 28 views
31

Tôi làm cách nào để chỉ định tên tệp khi bán dữ liệu vào luồng phản hồi?Chỉ định tên tệp cho PDF động trong asp.net

Ngay bây giờ tôi đang làm như sau:

byte[] data= GetFoo(); 
Response.Clear(); 
Response.Buffer = true; 
Response.ContentType = "application/pdf";    
Response.BinaryWrite(data); 
Response.End(); 

Với đoạn mã trên, tôi nhận được "foo.aspx.pdf" như tên tập tin để tiết kiệm. Tôi dường như nhớ có thể thêm một tiêu đề cho phản hồi để chỉ định tên tệp để lưu.

Trả lời

53

Thêm một nội dung bố trí vào tiêu đề:

Response.AddHeader("content-disposition", @"attachment;filename=""MyFile.pdf"""); 
+3

Dấu ngoặc kép phải được đặt quanh tên tệp. Xem http://kb.mozillazine.org/Filenames_with_spaces_are_truncated_upon_download –

15
Response.AppendHeader("Content-Disposition", "attachment; filename=foo.pdf"); 
+4

Nếu có ai thắc mắc tại sao lại tồn tại cả 'AddHeader' và' AppendHeader', [wonder no more ...] (http://msdn.microsoft.com/en-us/library/system.web.httpresponse. addheader.aspx) –

+0

http://stackoverflow.com/a/5648407/672244 – idok

+0

cách đặt tên tệp đó là động Response.AppendHeader ("Content-Disposition", "attachment; filename =" + Projname + " .pdf "); @ Skliwz –

1
Response.AddHeader("Content-Disposition", "attachment;filename=" & FileName & ";") 
+3

Điều đó có mùi giống như cú pháp VB. –

+0

Cảnh báo mờ Như Cảnh báo() – JoshYates1980

15

FYI ... nếu bạn sử dụng "inline" thay vì "đính kèm" các tập tin sẽ tự động mở trong IE. Thay vì nhắc người dùng bằng hộp thoại Mở/Lưu.

Response.AppendHeader("content-disposition", string.Format("inline;FileName=\"{0}\"", fileName)); 
+0

Đây chính xác là những gì tôi đang tìm kiếm. Vấn đề tiếp theo là tôi muốn đặt tên tệp mặc định để khi nhấn nút lưu, nó sẽ có tên tệp phù hợp làm mặc định. Ngay bây giờ tên tệp được đặt thành tên trang aspx đã tạo pdf. Bất cứ ai có một đề nghị? – Kevbo

1

Vì lý do nào đó, hầu hết các câu trả lời dường như không cố gắng mã hóa giá trị tên tệp. Nếu tệp chứa dấu cách, dấu chấm phẩy hoặc dấu ngoặc kép, tệp có thể không xuất hiện chính xác.

Dường như bạn có thể sử dụng lớp ContentDisposition để tạo ra một giá trị tiêu đề chính xác:

Response.AppendHeader("Content-Disposition", new ContentDisposition 
{ 
    FileName = yourFilename 
}.ToString()); 

Bạn có thể kiểm tra the source code for ContentDisposition.ToString() để xác nhận rằng nó đang cố gắng để mã hóa nó đúng cách.

Cảnh báo: Điều này dường như gặp sự cố khi tên tệp có dấu gạch ngang (không phải dấu gạch nối). Tôi chưa hề quan tâm đến điều này.

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