Domanda

Sto usando HttpContext oggetto implementato in HttpHandler bambino a scaricare un file, quando ho caratteri non ASCII nel nome del file Sembra strano in IE, mentre si guarda bene in Firefox.

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 hanno in nome del file si guarda bene in Firefox. aggiungendo EncodingType e charset è stato di alcuna utilità.

Nel cioè è 'Ãâ' 'ä' 'ö' 'ü' 'ó' 'Ãâ' 'ä' 'ö' 'ü' _ 'ó' e in Firefox è 'ß' 'å¤' '¶' 'ü' '³' 'ß' '¤ ' '¶' 'ü' '³'.

Qualsiasi idea di come questo può essere risolto?

È stato utile?

Soluzione

Ho avuto problemi simili. Devi usare HttpUtility.UrlEncode o < a href = "http://msdn.microsoft.com/en-us/library/ms525738.aspx" rel = "noreferrer"> Server.URLEncode per codificare il nome del file. Anche io ricordo che Firefox non ne aveva bisogno. Moreoverit rovinato il nome del file, quando si tratta di codifica 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 (nomi di file e quindi Content-Disposition) a US-ASCII.

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

  

Gli asterischi ( "*") vengono riutilizzati per fornire   l'indicatore che la lingua e   set di caratteri informazione è presente   e la codifica viene utilizzato. Una sola   citazione ( "'") è usato per delimitare la   informazioni set di caratteri e la lingua   all'inizio del parametro   valore. segni di percentuale ( "%") sono usati come   il flag di codifica, che concorda con   RFC 2047.

Il che significa che è possibile utilizzare UrlEncode per i simboli non ASCII, a patto che si include la codifica come affermato nel RFC. Ecco un esempio:

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

Si noti che filename è incluso in aggiunta a filename* per la compatibilità all'indietro. È inoltre possibile scegliere un'altra codifica e modificare il parametro di conseguenza, ma UTF-8 copre tutto.

Altri suggerimenti

HttpUtility.UrlPathEncode potrebbe essere una scelta migliore. Come URLEncode sostituirà gli spazi con segni '+'.

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.

Il Sostituisci è necessario, perché Chrome non piace virgola (,) in valori dei parametri: http://www.gangarasa.com/lets-Do-GoodCode/tag/err_response_headers_multiple_content_disposition/

Si consiglia di leggere RFC 6266 e guardare le prove a http://greenbytes.de/tech/tc2231/ .

Per me questo ha 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 esempio di risposta con codificati Content-Disposition nome file utilizzando 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 avuto a che fare i ourselfs di codifica, la classe ContentDispositionHeaderValue si occupa di questo.

Ho usato i casi di test per l'intestazione Content-Disposition sopra: http://greenbytes.de/tech/ tc2231 / come indicato da Julian Reschke. Informazioni sulla classe ContentDispositionHeaderValue può essere trovato su MSDN.

Per Asp.Net core (versione 2 come di questo post) UrlPathEncode è deprecato, ecco come fare per ottenere il risultato desiderato:

System.Net.Mime.ContentDisposition cd = new System.Net.Mime.ContentDisposition
{
   FileName = Uri.EscapeUriString(fileName),
   Inline = true  // false = prompt the user for downloading;  true = browser to try to show the file inline
};

Response.Headers.Add("Content-Disposition", cd.ToString());

`m utilizzando Uri.EscapeUriString per convertire tutti i caratteri per la loro rappresentazione esadecimale e string.Normalize per Unicode forma normalizzazione C. (Testato in framework ASP.NET MVC5 4.5)

    var contentDispositionHeader = new System.Net.Mime.ContentDisposition
    {
        Inline = false,
        FileName = Uri.EscapeUriString(Path.GetFileName(pathFile)).Normalize()
    };
    Response.Headers.Add("Content-Disposition", contentDispositionHeader.ToString());
    string mimeType = MimeMapping.GetMimeMapping(Server.MapPath(pathFile));
    return File(file, mimeType);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top