104

Tôi đã tìm thấy đoạn code asp.net sau để thể rất hữu ích khi phục vụ tập tin từ một cơ sở dữ liệu:Sử dụng nội dung bố trí trong một tiêu đề HTTP response

Response.AppendHeader("content-disposition", "attachment; filename=" + fileName); 

này cho phép người dùng lưu các tập tin vào máy tính của họ và sau đó quyết định cách sử dụng nó, thay vì trình duyệt đang cố sử dụng tệp.

Có thể làm gì khác với tiêu đề phản hồi bố trí nội dung?

+1

Có một số tài liệu thoải mái của Microsoft: http://support.microsoft.com/kb/260519 –

+22

Lưu ý rằng mã mẫu của bạn sẽ bị hỏng nếu tên tệp chứa các ký tự trắng hoặc không phải ASCII. Xem RFC 6266 để biết thêm thông tin. –

+0

@JulianReschke, Còn về các ký tự ASCII được coi là không thể in được thì sao? ('0' đến' 0x1F') – Pacerier

Trả lời

75

Quyền hạn trên tiêu đề bố trí nội dung là RFC 1806RFC 2183. Mọi người cũng đã phát minh ra Điều quan trọng cần lưu ý là tiêu đề bố trí nội dung không phải là một phần của tiêu chuẩn HTTP 1.1.

Các HTTP 1.1 Standard (RFC 2616) cũng đề cập đến tác dụng phụ an ninh có thể xảy ra nội dung bố trí:

15,5 Content-Disposition vấn đề

RFC 1806 [35], từ đó thường thực hiện nội dung -Disposition
(xem phần 19.5.1) tiêu đề trong HTTP là có nguồn gốc, có một số rất
cân nhắc bảo mật nghiêm trọng. Content-Disposition không phải là một phần của
tiêu chuẩn HTTP, nhưng vì nó là thực hiện rộng rãi, chúng tôi đang
tài liệu sử dụng và rủi ro của nó đối với implementors. Xem RFC 2183 [49]
(cập nhật RFC 1806) để biết chi tiết.

Lưu ý rằng RFC 6266 thay thế RFC được tham chiếu bên dưới. Section 7 phác thảo một số vấn đề liên quan đến bảo mật liên quan.

+30

Ngày nay, cơ quan có thẩm quyền là RFC 6266. –

+17

RFC 6266 có thể tìm thấy tại đây: http://tools.ietf.org/html/rfc6266. – rstackhouse

+0

@JulianReschke, Cách "thay thế" và "cập nhật" hoạt động như thế nào? Có phiên bản mới hơn như RFC 7230 cũng làm RFC 6266 là lỗi thời? – Pacerier

21

Vâng, có vẻ như tiêu đề Nội dung-Bố trí ban đầu được tạo cho e-mail chứ không phải trên web. (Link to relevant RFC.)

Tôi đoán rằng các trình duyệt web có thể đáp ứng với

Response.AppendHeader("content-disposition", "inline; filename=" + fileName); 

khi tiết kiệm, nhưng tôi không chắc chắn.

+3

Chỉ FF thực hiện; xem http://greenbytes.de/tech/tc2231/#inlwithasciifilename –

+2

Tôi vừa thử với IE và Chrome mới nhất và nó hoạt động ngay bây giờ. – Traubenfuchs

2

Tiêu đề này được xác định trong RFC 2183, vì vậy đó sẽ là nơi tốt nhất để bắt đầu đọc.

Giá trị được phép là những giá trị được đăng ký với Cơ quan số được gán cho Internet (IANA); của họ registry of values nên được xem như là nguồn dứt khoát.

4

Đối với người dùng asp.net,.NET framework cung cấp một lớp học để tạo ra một tiêu đề bố trí nội dung: System.Net.Mime.ContentDisposition

sử dụng cơ bản:

var cd = new System.Net.Mime.ContentDisposition(); 
cd.FileName = "myFile.txt"; 
cd.ModificationDate = DateTime.UtcNow; 
cd.Size = 100; 
Response.AppendHeader("content-disposition", cd.ToString()); 
+1

Hãy coi chừng, lớp học này không phù hợp với [RFC 6266] (http://tools.ietf.org/html/rfc6266#section-4.3). Mã hóa UTF-8 base64 trong tham số 'filename', thay vì sử dụng tham số' filename * 'với mã hóa [RFC 5987] (http://tools.ietf.org/html/rfc5987). Không có cách nào để lấy được hoặc sử dụng fx utils để sửa lỗi đó, hầu như mọi thứ đều không thể ghi đè hoặc nội bộ ... .Net fx vẫn còn là một cách học tập cởi mở và mở rộng. Trong MVC 5.2, lớp 'FileResult' làm tốt hơn một chút cho' filename', nhưng không xử lý các tham số khác như 'inline' và phần lớn việc thực hiện nó cũng là nội bộ ... –

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