2010-03-30 9 views
7

Sto usando l'oggetto HttpContext implementato in HttpHandler figlio per scaricare un file, quando ho caratteri non ASCII nel nome del file sembra strano in IE mentre sembra a posto in Firefox.Unicode nell'intestazione Content-Disposition

sotto è il codice: -

 context.Response.ContentType = ".cs"; 
context.Response.AppendHeader("Content-Length", data.Length.ToString()); 
context.Response.AppendHeader("Content-Disposition", String.Format("attachment; filename={0}",filename)); 
     context.Response.OutputStream.Write(data, 0, data.Length); 

context.Response.Flush(); 

quando fornisco 'ß' 'å¤' ü '¶' '' '³' 'ß' 'å¤' '¶' 'ü '' ó 'nel campo del nome del file ha un aspetto diverso da quello che ho nel nome del file, sembra a posto in firefox. l'aggiunta di EncodingType e charset è stata inutile.

Nel cioè è 'ăƒâ' 'ä' 'ö' 'ü' 'ó' 'ăƒâ' 'ä' 'ö' 'ü'_ 'ó' e in firefox è 'ß' 'ä' 'ü' 'ó' 'ß' 'ä' 'ö' 'ü' 'ó'.

Qualche idea su come può essere risolto?

+0

È questo il contenuto del file o il nome file stesso? – leppie

+0

@leppie, è il nome del file stesso – Ranjeet

risposta

12

Ho avuto un problema simile. Devi usare HttpUtility.UrlEncode o Server.UrlEncode per codificare il nome del file. Inoltre ricordo che Firefox non ne aveva bisogno. Inoltre, il nome file è rovinato quando è codificato nell'URL. Il mio codice:

// IE needs url encoding, FF doesn't support it, Google Chrome doesn't care 
if (Request.Browser.IsBrowser ("IE")) 
{ 
    fileName = Server.UrlEncode(fileName); 
} 

Response.Clear(); 
Response.AddHeader ("content-disposition", String.Format ("attachment;filename=\"{0}\"", fileName)); 
Response.AddHeader ("Content-Length", data.Length.ToString (CultureInfo.InvariantCulture)); 
Response.ContentType = mimeType; 
Response.BinaryWrite(data); 

Modifica

Ho letto con più attenzione specifica. Prima di tutto RFC2183 afferma che:

corrente [RFC 2045] grammatica limita i valori dei parametri (e quindi Content-Disposition nomi di file) a US-ASCII.

Ma poi ho trovato riferimenti che [RFC 2045] è absolete e uno deve fare riferimento RFC 2231, in cui si afferma:

asterischi ("*") vengono riutilizzati per fornire l'indicatore che la lingua e sono presenti le informazioni sul set di caratteri e viene utilizzata la codifica. Una virgola singola ("'") viene utilizzata per delimitare il set di caratteri e le informazioni sulla lingua all'inizio del valore del parametro . segni di percentuale ("%") sono usati come la bandiera di codifica, che concorda con RFC 2047.

Il che significa che è possibile utilizzare UrlEncode per i simboli non ASCII come ho detto prima, ma si potrebbe anche aggiungere descrizione di codifica. Ecco un esempio:

string.Format("attachment; filename*=UTF-8''{0}", Server.UrlEncode(fileName)); 

non ho provato però ..

+0

@Sergej, ho provato quello che hai detto e funziona bene, puoi spiegare perché ha rovinato il nome del file, così ho chiaro nella mia mente prima di implementarlo. – Ranjeet

+0

Come per la risposta di Ash, l'ho usato ma con 'UrlPathEncode', che ha funzionato come un incantesimo (non aggiunge i segni '+'). – Andrew

5

HttpUtility.UrlPathEncode potrebbe essere un'opzione migliore. Come URLEncode sostituirà gli spazi con i segni '+'.

3

Per me questa soluzione sta lavorando su tutti i principali browser:

Response.AppendHeader("Content-Disposition", string.Format("attachment; filename*=UTF-8''{0}", HttpUtility.UrlPathEncode(fileName).Replace(",", "%2C")); 
var mime = MimeMapping.GetMimeMapping(fileName); 
return File(fileName, mime); 

Utilizzando ASP.NET MVC 3.

Sostituisci è necessaria, perché Chrome non piace virgola (,) nel parametro valori: http://www.gangarasa.com/lets-Do-GoodCode/tag/err_response_headers_multiple_content_disposition/

1

Per me questo risolto il problema:

var result = new HttpResponseMessage(HttpStatusCode.OK) 
{ 
    Content = new ByteArrayContent(data) 
}; 

result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") 
{ 
    FileNameStar = "foo-ä-€.html" 
}; 

quando guardo annuncio del repsonse in violinista posso vedere il nome del file è stato automaticcaly codificati con UTF-8:

Fiddler response example with encoded Content-Disposition filename using UTF-8

Se guardiamo al valore dell'intestazione Content-Disposition possiamo vedere che sarà lo stesso di @Johannes Geyer la sua risposta. L'unica differenza è che non abbiamo dovuto fare la codifica di noi stessi, la classe ContentDispositionHeaderValue si occupa di questo.

Ho utilizzato il Testcase per l'intestazione Content-Disposition su: http://greenbytes.de/tech/tc2231/ come menzionato da Julian Reschke. Le informazioni sulla classe ContentDispositionHeaderValue sono disponibili su MSDN.