2009-10-21 10 views
16

Gdy nazwa pliku brzmi "Algunas MARCAS que nos acompañan" ASP.NET MVC podnieść System.FormatException, gdy próbuję pobrać ten plik. Ale jeśli nazwa pliku brzmi "Asistente de Gerencia Comercial", to nie.Jak zakodować nazwę pliku do pobrania?

Domyślam się, że dzieje się tak, ponieważ coś jest związane z kodowaniem UTF-8, ale nie wiem, jak zakodować ten ciąg.

Jeśli mam rację, w jaki sposób mogę zakodować ciąg znaków w kodowaniu UTF-8? Jeśli nie mam racji, jaki jest mój problem?

+0

Jak przesyłasz plik z powrotem do użytkownika? Używając 'System.Web.Mvc.FileResult'? Czy możesz opublikować swój kod? –

+0

Tak, używam FileResult. – eKek0

+0

Dziwne jest to, że 'System.Web.Mvc.FileResult' wewnętrznie używa' System.Net.Mime.ContentDisposition' do generowania nagłówka, który dodaje do odpowiedzi. Spodziewałbym się, że klasa będzie w stanie obsłużyć jakiekolwiek kodowanie ciągów, które jest niezbędne, aby to działało. –

Odpowiedz

22

zakodować nazwę pliku tak do pobierania,

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

Zastępuje spacje znakiem +, który może nie być tym, co chcesz. – Cosmin

+2

** UWAGA **: Aby uzyskać prawidłowe rozwiązanie w czasach nowożytnych, zobacz dokument RFC6266: http://tools.ietf.org/html/rfc6266 –

5

podstawie ZZ Coder odpowiedzi, a ponieważ używam FileResult, postanowiłem zakodować nazwę pliku jako:

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

Niedawno z tym walczyłem, mając do wyboru wiele potencjalnych języków (chiński dobrze jest testować). Oto coś, co jest blisko tego, co otrzymałem (inne szczegóły implementacji są wyłączone):

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

Ten numer jest znany od lat. O ile mogę powiedzieć, nie ma obecnie interoperacyjnego sposobu, aby to zrobić, więc odpowiedzią jest tylko obsługa jednego zestawu przeglądarek lub wykonanie podsłuchu przez agenta użytkownika.

przypadki testowe linki na: http://greenbytes.de/tech/tc2231/

0

uwaga, że ​​przy użyciu kodowania UTF zastępuje spacje w nazwie pliku na „+”, stosując następujące kody albo produkować takie same wyniki:

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

zamiast korzystania httpUtility która zastępuje spacje w nazwie pliku z „+” za pomocą Kodeksu Poniższe rozwiązania problemu:

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

proszę pamiętać, że jeśli odzyskać nazwę pliku z danych cię może najpierw trzeba przyciąć nazwę! należy również dodać następujące linie kodu z wyprzedzeniem:

Response.Charset = "utf-8"; 
Response.HeaderEncoding = UnicodeEncoding.UTF8; 
Response.ContentEncoding = UnicodeEncoding.UTF8; 
Powiązane problemy