2009-10-13 16 views
15

Tôi gặp sự cố với tệp tải xuống khi tải xuống thay thế tất cả các dấu cách bằng dấu gạch dưới.Tại sao HttpUtility.UrlEncode (HttpUtility.UrlDecode ("% 20")) trả về + thay vì% 20?

Về cơ bản tôi nhận được một vấn đề ở đây:

Response.AddHeader("Content-Disposition", 
    "attachment; filename=" + someFileName); 

Vấn đề là nếu someFileName đã có một không gian trong đó như "kiểm tra out.txt này", sau đó người dùng sẽ được nhắc nhở để tải về "check_this_out .txt ".

I figured lựa chọn tốt nhất sẽ được URLEncode tên tập tin vì vậy tôi cố gắng

HttpUtility.UrlEncode(someFileName); 

Nhưng nó thay thế khoảng trống bằng dấu cộng, mà bối rối tôi. Vì vậy, sau đó tôi chỉ cần thử

HttpUtility.UrlEncode(HttpUtility.UrlDecode("%20")) 

và giải mã hoạt động đúng cách và mang lại cho tôi một không gian, nhưng mã hóa chiếm không gian và sau đó mang lại cho tôi dấu cộng.

Tôi thiếu gì ở đây, điều này có đúng không? Nếu vậy, làm thế nào tôi nên mã hóa không gian đúng cách vào% 20, đó là những gì tôi cần.

Trả lời

6

Trích dẫn từ this link

tôi đã đi qua này bản thân mình. Nếu bạn có thể thay đổi không gian thành% 20s thì IE7 sẽ chuyển đổi chúng một cách chính xác. Firefox mặc dù sẽ mất chúng theo nghĩa đen (ít nhất là khi sử dụng tiêu đềBố cục nội dung) để bạn sẽ cần thực hiện việc này cho các yêu cầu từ chỉ IE7.

Chúng tôi đã làm như sau trong ứng dụng của chúng tôi. (Một kho lưu trữ tài liệu dựa tomcat)

String userAgent = request.getHeader("User-Agent"); 
if (userAgent.contains("MSIE 7.0")) { 
    filename = filename.replace(" ", "%20");  
}   
response.addHeader("Content-disposition", 
    "attachment;filename=\"" + filename + "\""); 
+0

Cảm ơn, tôi đã tìm thấy điều này trong một bài viết khác ở nơi khác với cùng giải pháp như bạn có. Tôi có thể sẽ phải làm điều này, nhưng nó chỉ cảm thấy sai/bẩn đối với tôi. Oh well. – Joseph

16

Về cơ bản cả% 20 và + là cách hợp lệ để mã hóa không gian. Rõ ràng phương pháp URLEncode phải chọn một trong những lựa chọn ... nếu nó đã chọn để làm theo cách khác, người khác sẽ hỏi tại sao UrlEncode(UrlDecode("+")) trả lại "% 20" ...

Bạn luôn có thể mã hóa nó, sau đó chỉ cần làm một chuỗi thẳng thay thế trên "+" cho "% 20". Tôi nghĩ rằng sẽ làm việc ...

+1

Cảm ơn Jon. Vấn đề tôi thấy mặc dù, là vì nó chọn để đi với các +, tập tin của tôi được hiển thị như "check + this + out.txt" thay vì với không gian, đó là mục tiêu tôi đang cố gắng để đạt được. – Joseph

+0

@Joseph: như Jon đã nói, "" được thay bằng "+"; khi bạn cố gắng thoát "+", bạn sẽ đi với "% 2B" –

+0

@Rubens Tôi hiểu, nhưng điều đó vẫn không giải quyết được vấn đề của tôi. Hoặc tôi mã hóa nó và tập tin của tôi kết thúc được gọi là "check + this + out.txt" hoặc tôi không mã hóa nó và nó được gọi là "check_this_out.txt". Làm cách nào để làm cho nó hiển thị đúng không gian màu trắng? – Joseph

9

I figured lựa chọn tốt nhất sẽ được URLEncode tên tập tin

Đó không phải là cách đúng đắn để đưa out-of-band nhân vật trong tham số tiêu đề, chẳng hạn như Content-Disposition-filename và chỉ hoạt động (đôi khi) trong IE do lỗi. Trên thực tế nó là một chút của một vấn đề lâu năm: there is no right way.

Nếu bạn cần đặt các ký tự đặc biệt trong tên tệp được tải xuống, bạn không thể thực hiện điều đó một cách đáng tin cậy với tên tệp Nội dung-Bố cục. Thay vào đó, hãy bỏ qua tham số ‘filename’ từ tiêu đề đính kèm Nội dung-Bố trí và để lại tên tệp bạn muốn trong phần đuôi của URL.Trong trường hợp không có tham số tên tệp, trình duyệt sẽ lấy nó từ đường dẫn URL, trong đó mã hóa URL đúng cách để giải quyết các ký tự đặc biệt.

2

Xin chào, tôi cũng gặp phải sự cố tương tự khi tải xuống các tệp có không gian trong đó.

Vui lòng xem liên kết có các bộ tốt nhất và đưa ra câu trả lời hoàn chỉnh.

http://kb.mozillazine.org/Filenames_with_spaces_are_truncated_upon_download

Vì lợi ích của sự hiểu biết Tôi chỉ thêm mã ASP.net như thế nào để giải quyết vấn đề này.

string document = @"C:\Documents and Settings\Gopal.Ampolu\My Documents\Downloads\" + "Disciplinary & Grievance Procedures..doc"; 
string filename = "Disciplinary & Grievance Procedures..doc"; 

Response.ContentType = mimeType; 
Response.AddHeader("Content-Disposition", @"attachment; filename=""" + HttpUtility.UrlDecode(filename) + @""""); 
Response.Flush(); 

Từ trên bạn có thể thấy rằng khi thêm tiêu đề vào phản hồi, tên tệp được kèm theo dấu ngoặc kép. Hãy đảm bảo rằng "tên tệp" phải được Giải mã bằng UrlDecode.

1

hơn Một lựa chọn cũng là ở đó, nếu bạn có thể thân mật khách hàng về bản cập nhật cửa sổ hotfix có sẵn tại sau:

Windows Hotfix Update for IE white space issue

Đó là phía khách hàng, vì vậy không thể áp dụng cho tất cả các kịch bản nhưng vẫn còn một tùy chọn nếu khả thi.