2009-10-21 15 views
16

Quando il nome del file è "Algunas MARCAS que nos acompañan" ASP.NET MVC genera un System.FormatException quando provo a scaricare quel file. Ma se il nome del file è "Asistente de Gerencia Comercial" non è così.Come si codifica un nome file per il download?

Immagino che questo sia dovuto a qualcosa correlato alla codifica UTF-8, ma non so come codificare quella stringa.

Se ho ragione, come posso codificare la stringa nella codifica UTF-8? Se non ho ragione, qual è il mio problema?

+0

Come stai restituendo il file all'utente adesso? Usando 'System.Web.Mvc.FileResult'? Puoi pubblicare il tuo codice? –

+0

Sì, sto usando FileResult. – eKek0

+0

La cosa strana è che 'System.Web.Mvc.FileResult' utilizza internamente' System.Net.Mime.ContentDisposition' per generare l'intestazione che aggiunge alla risposta. Mi sarei aspettato che la classe fosse in grado di gestire qualsiasi codifica delle stringhe necessaria per fare in modo che funzionasse. –

risposta

22

ho codificare il nome del file in questo modo per il download,

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

Sostituisce gli spazi con +, che potrebbe non essere quello che desideri. – Cosmin

+2

** NOTA **: per la soluzione corretta in tempi moderni, vedere RFC6266: http://tools.ietf.org/html/rfc6266 –

5

Sulla base di ZZ Coder risposta, e perché sto utilizzando FileResult, ho deciso di codificare il nome del file come:

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

Recentemente ho combattuto un po 'con questo, avendo molti linguaggi potenziali usati per i nomi dei file (il cinese è buono da testare). Ecco qualcosa di simile a quello che ho finito (altri dettagli di implementazione esclusi):

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

Questo problema è noto da anni. Per quanto ne so, al momento non esiste un modo interoperabile per farlo, quindi la risposta è di supportare solo un set di browser o di eseguire lo sniffing di User Agent.

casi di test e collegamenti a: http://greenbytes.de/tech/tc2231/

0

nota che l'utilizzo di UTF codifica sostituisce gli spazi nel nome del file in '+', utilizzando i seguenti codici producono gli stessi risultati:

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

invece di utilizzare httpUtility che sostituisce gli spazi nel nome del file con il "+" utilizzando il seguente codice risolvere il problema:

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

si prega di notare che se si recupera il nome del file da dati impostati potrebbe essere necessario tagliare il nome prima! devi aggiungere in anticipo le seguenti righe di codice:

Response.Charset = "utf-8"; 
Response.HeaderEncoding = UnicodeEncoding.UTF8; 
Response.ContentEncoding = UnicodeEncoding.UTF8; 
Problemi correlati