2009-10-21 20 views
16

Khi tên tệp là "Algunas MARCAS que nos acompañan" ASP.NET MVC tăng System.FormatException khi tôi cố tải xuống tệp đó. Nhưng nếu tên tập tin là "Asistente de Gerencia Comercial" thì không.Làm cách nào để mã hóa tên tệp để tải xuống?

Tôi đoán điều này là do một cái gì đó liên quan đến mã hóa UTF-8, nhưng tôi không biết cách mã hóa chuỗi đó.

Nếu tôi đúng, làm cách nào để mã hóa chuỗi trong mã hóa UTF-8? Nếu tôi không đúng, vấn đề của tôi là gì?

+0

Bạn đang gửi tệp này cho người dùng ngay bây giờ như thế nào? Sử dụng 'System.Web.Mvc.FileResult'? Bạn có thể gửi mã của bạn? –

+0

Có, tôi đang sử dụng FileResult. – eKek0

+0

Điều kỳ lạ là 'System.Web.Mvc.FileResult' sử dụng nội bộ' System.Net.Mime.ContentDisposition' để tạo tiêu đề mà nó thêm vào phản hồi. Tôi đã mong đợi rằng lớp học để có thể xử lý bất kỳ mã hóa chuỗi là cần thiết để thực hiện công việc này. –

Trả lời

22

tôi mã hóa tên file như thế này cho tải về,

HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename= " + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8)); 
+3

Điều này thay thế khoảng trắng bằng dấu +, có thể không phải là thứ bạn muốn. – Cosmin

+2

** NOTE **: Để có giải pháp đúng trong thời hiện đại, hãy xem RFC6266: http://tools.ietf.org/html/rfc6266 –

5

Dựa trên ZZ Coder câu trả lời, và vì tôi đang sử dụng FileResult, tôi quyết định để mã hóa tên tập tin như:

HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8) 
0

Gần đây tôi đã chiến đấu với điều này một chút, có nhiều ngôn ngữ tiềm năng được sử dụng cho các tên tập tin (Trung Quốc là tốt để thử nghiệm với). Dưới đây là nội dung nào đó gần với những gì tôi đã kết thúc với (các chi tiết triển khai khác bị loại trừ):

HttpUtility.UrlEncode("é", System.Text.Encoding.GetEncoding("ISO-8859-1")) 
1

Sự cố này đã được nhiều năm biết đến. Theo như tôi có thể nói, hiện tại không có cách nào có thể tương tác để thực hiện việc này, do đó, câu trả lời là chỉ hỗ trợ một bộ trình duyệt hoặc để làm Đại lý người dùng đánh hơi.

trường hợp thử nghiệm và liên kết tại địa chỉ: http://greenbytes.de/tech/tc2231/

0

lưu ý rằng việc sử dụng UTF mã hóa thay thế các khoảng trống trong tên tập tin vào '+', sử dụng mã sau đây tạo ra kết quả tương tự:

HttpUtility.UrlEncode("é", System.Text.Encoding.GetEncoding("ISO-8859-1")) 
HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8) 
0

thay vì sử dụng httpUtility thay thế các khoảng trống trong tên tập tin với "+" sử dụng mã quyết tâm sau khi vấn đề:

string attachment = String.Format("attachment; filename={0}",Server.UrlPathEncode(file.Name.TrimEnd())); 
Response.AddHeader("Content-Disposition", attachment); 

xin lưu ý rằng nếu bạn lấy tên tập tin từ tập dữ liệu bạn có thể cần cắt tên trước! bạn cũng phải thêm các dòng mã sau đây:

Response.Charset = "utf-8"; 
Response.HeaderEncoding = UnicodeEncoding.UTF8; 
Response.ContentEncoding = UnicodeEncoding.UTF8; 
Các vấn đề liên quan