Come codificare il parametro nome file dell'intestazione Content-Disposition in HTTP?


535

Le applicazioni Web che desiderano forzare il download di una risorsa anziché renderizzare direttamente in un browser Web emettono Content-Dispositionun'intestazione nella risposta HTTP del modulo:

Content-Disposition: attachment; filename=FILENAME

Il filenameparametro può essere utilizzato per suggerire un nome per il file in cui la risorsa viene scaricata dal browser. RFC 2183 (Content-Disposition), tuttavia, afferma nella sezione 2.3 (Il parametro Nome file) che il nome del file può usare solo caratteri US-ASCII:

La grammatica corrente [RFC 2045] limita i valori dei parametri (e quindi i nomi dei file di Content-Disposition) a US-ASCII. Riconosciamo la grande desiderabilità di consentire insiemi di caratteri arbitrari nei nomi dei file, ma è oltre lo scopo di questo documento definire i meccanismi necessari.

Esistono prove empiriche, tuttavia, che i browser Web più popolari oggi sembrano consentire caratteri non US-ASCII ma (per la mancanza di uno standard) non sono d'accordo sullo schema di codifica e sulla specifica del set di caratteri del nome del file. La domanda è quindi: quali sono i vari schemi e codifiche utilizzati dai browser più diffusi se il nome del file "naïvefile" (senza virgolette e dove la terza lettera è U + 00EF) deve essere codificato nell'intestazione Content-Disposition?

Ai fini di questa domanda, i browser più diffusi sono:

  • Firefox
  • Internet Explorer
  • Safari
  • Google Chrome
  • musica lirica

Ha funzionato per Mobile Safari (raw utf-8 come suggerito da @Martin Ørding-Thomsen), ma non funziona per GoodReader dallo stesso dispositivo. Qualche idea?
— Thilo


1
La risposta di Kornel si rivelò essere il percorso di minor resistenza, se puoi impostare l'ultimo segmento del percorso; abbinalo a Content-Disposition: attachment.
— Antti Haapala,

Risposte:


94

Si discute di questo, compresi i collegamenti ai test del browser e la compatibilità con le versioni precedenti, nella proposta RFC 5987 , "Set di caratteri e codifica del linguaggio per i parametri del campo di intestazione HTTP (Hypertext Transfer Protocol)".

RFC 2183 indica che tali intestazioni dovrebbero essere codificate secondo RFC 2184 , che era obsoleto da RFC 2231 , coperto dal progetto RFC sopra.


5
Si noti inoltre che la bozza di Internet (non "bozza di RFC") è stata completata e il documento finale è RFC 5987 ( greenbytes.de/tech/webdav/rfc5987.html )
— Julian Reschke,

11
In relazione a questo, ho scoperto che Firefox (versioni 4-9 incluse) si rompe se c'è una virgola (,) nel nome del file, ad es Content-Disposition: filename="foo, bar.pdf". Il risultato è che Firefox scarica il file correttamente ma mantiene l' .partestensione (ad es foo,bar.pdf-1.part.). Quindi, ovviamente, il file non si aprirà correttamente perché l'applicazione non è associata .part. Altri caratteri ASCII sembrano funzionare correttamente.
— catchdave,

3
Per ulteriori informazioni sul comportamento di IE, consultare blogs.msdn.com/b/ieinternals/archive/2010/06/07/…
— EricLaw

5
@catchdave: hai dimenticato "allegato;" parte.
— Christoffer Hammarström,

6
Tutto sommato, questa non è altro che una risposta solo link con 74 voti positivi.
— Antti Haapala,

364

So che questo è un vecchio post, ma è ancora molto pertinente. Ho scoperto che i browser moderni supportano rfc5987, che consente la codifica utf-8, codificata in percentuale (codifica url). Quindi Naïve file.txt diventa:

Content-Disposition: attachment; filename*=UTF-8''Na%C3%AFve%20file.txt

Safari (5) non supporta questo. Invece dovresti usare lo standard Safari per scrivere il nome del file direttamente nell'intestazione codificata utf-8:

Content-Disposition: attachment; filename=Naïve file.txt

IE8 e precedenti non lo supportano e devi usare lo standard IE di codifica utf-8, codificato in percentuale:

Content-Disposition: attachment; filename=Na%C3%AFve%20file.txt

In ASP.Net utilizzo il seguente codice:

string contentDisposition;
if (Request.Browser.Browser == "IE" && (Request.Browser.Version == "7.0" || Request.Browser.Version == "8.0"))
    contentDisposition = "attachment; filename=" + Uri.EscapeDataString(fileName);
else if (Request.Browser.Browser == "Safari")
    contentDisposition = "attachment; filename=" + fileName;
else
    contentDisposition = "attachment; filename*=UTF-8''" + Uri.EscapeDataString(fileName);
Response.AddHeader("Content-Disposition", contentDisposition);

Ho testato quanto sopra usando IE7, IE8, IE9, Chrome 13, Opera 11, FF5, Safari 5.

Aggiornamento novembre 2013:

Ecco il codice che attualmente uso. Devo ancora supportare IE8, quindi non posso liberarmi della prima parte. Si scopre che i browser su Android utilizzano il download manager Android integrato e non possono analizzare in modo affidabile i nomi dei file in modo standard.

string contentDisposition;
if (Request.Browser.Browser == "IE" && (Request.Browser.Version == "7.0" || Request.Browser.Version == "8.0"))
    contentDisposition = "attachment; filename=" + Uri.EscapeDataString(fileName);
else if (Request.UserAgent != null && Request.UserAgent.ToLowerInvariant().Contains("android")) // android built-in download manager (all browsers on android)
    contentDisposition = "attachment; filename=\"" + MakeAndroidSafeFileName(fileName) + "\"";
else
    contentDisposition = "attachment; filename=\"" + fileName + "\"; filename*=UTF-8''" + Uri.EscapeDataString(fileName);
Response.AddHeader("Content-Disposition", contentDisposition);

Quanto sopra ora testato in IE7-11, Chrome 32, Opera 12, FF25, Safari 6, usando questo nome file per il download: 你好 abcABCæøåÆØÅäöüïëëîâéíáóúýñ½§! # ¤% & () = `@ £ $ € {[]} + ´¨ ^ ~ '-_,;. txt

Su IE7 funziona per alcuni personaggi ma non per tutti. Ma a chi importa di IE7 al giorno d'oggi?

Questa è la funzione che utilizzo per generare nomi di file sicuri per Android. Nota che non so quali personaggi sono supportati su Android ma ho testato che questi funzionano sicuramente:

private static readonly Dictionary<char, char> AndroidAllowedChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ._-+,@£$€!½§~'=()[]{}0123456789".ToDictionary(c => c);
private string MakeAndroidSafeFileName(string fileName)
{
    char[] newFileName = fileName.ToCharArray();
    for (int i = 0; i < newFileName.Length; i++)
    {
        if (!AndroidAllowedChars.ContainsKey(newFileName[i]))
            newFileName[i] = '_';
    }
    return new string(newFileName);
}

@TomZ: ho testato in IE7 e IE8 e si è scoperto che non avevo bisogno di sfuggire all'apostrofo ('). Hai un esempio di dove fallisce?

@Dave Van den Eynde: Combinando i due nomi di file su una riga secondo RFC6266 funziona tranne Android e IE7 + 8 e ho aggiornato il codice per riflettere questo. Grazie per il suggerimento

@Thilo: nessuna idea di GoodReader o di qualsiasi altro non browser. Potresti avere un po 'di fortuna usando l'approccio Android.

@Alex Zhukovskiy: non so perché, ma come discusso su Connect non sembra funzionare molto bene.


1
Ha funzionato per Mobile Safari (raw utf-8 come suggerito sopra), ma non funziona per GoodReader dallo stesso dispositivo. Qualche idea?
— Thilo

1
Anche IE7 e 8 necessitano di un escape degli apostrofi: .Replace ("'", Uri.HexEscape (' \ ''))
— TomZ

1
La scrittura diretta di caratteri UTF-8 sembra funzionare con le versioni correnti di Firefox, Chrome e Opera. Non ho testato Safari e IE.
— Martin Tournoij,

21
Perché non combinarli, come Content-Disposition: attachment; filename*=UTF-8''Na%C3%AFve%20file.txt; filename=Na%C3%AFve%20file.txte saltare il browser annusando? Funzionerebbe?
— Dave Van den Eynde,

9
Le persone gentili di fastmail hanno trovato un'altra soluzione: blog.fastmail.com/2011/06/24/download-non-english-filenames Content-Disposition: allegato; filename = "foo-% c3% a4.html"; nome file * = UTF-8''foo-% c3% a4.html Se si specifica il nome file due volte (una volta senza il prefisso UTF-8 e una volta con), funziona in IE8-11, Edge, Chrome, Firefox e Safari ( sembra un apple fixed safari, quindi ora funziona anche lì)
— wullinkm,

169

Esiste un'alternativa semplice e molto robusta: utilizzare un URL che contiene il nome file desiderato .

Quando il nome dopo l'ultima barra è quello che desideri, non hai bisogno di intestazioni extra!

Questo trucco funziona:

/real_script.php/fake_filename.doc

E se il tuo server supporta la riscrittura degli URL (ad es. mod_rewriteIn Apache), puoi nascondere completamente la parte dello script.

I caratteri negli URL devono essere in UTF-8, codificati byte per byte:

/mot%C3%B6rhead   # motörhead

3
Prova GetAttachment.aspx / fake_filename.doc? Id = 34 (anche se potrebbe essere una stranezza solo per Apache)
— Kornel

2
questa è una soluzione fantastica; mi ha davvero aiutato molto. Grazie.
— kristopolous,

6
Ho seguito la pista dei conigli e ho provato alcune delle altre soluzioni; cercare di annusare il browser e la versione corretti per impostare correttamente le intestazioni è un vero incubo. Chrome si identificava erroneamente come Safari, che non si comporta affatto allo stesso modo (si interrompe sulle virgole se non è codificato correttamente). Salva te stesso il problema, usa questa soluzione e alias l'URL, se necessario.
— mpen

3
Il /:id/:filenamemetodo è davvero semplice e funziona, grazie!
— Luca Steeb,

2
Mille volte "Sì". Con questo, vincerai seriamente. Altri ancora - alcuni browser Android saranno flat out ignorare la Content-Dispositione creare nomi di file molto interessanti invece (che saranno generati dal vostro percorso). Quindi l'unica soluzione per mantenere la sanità mentale è semplicemente impostare Content-Disposition: attachmente passare il nome file desiderato come ultimo componente del percorso:
— Julik

73

RFC 6266 descrive " Uso del campo di intestazione di disposizione del contenuto nel protocollo di trasferimento ipertestuale (HTTP) ". Citando da quello:

6. Considerazioni sull'internazionalizzazione

Il filename*parametro " " ( Sezione 4.3 ), utilizzando la codifica definita in [ RFC5987 ], consente al server di trasmettere caratteri al di fuori del set di caratteri ISO-8859-1 e di specificare facoltativamente la lingua in uso.

E nella loro sezione di esempi :

Questo esempio è uguale a quello sopra, ma aggiungendo il parametro "nome file" per la compatibilità con i programmi utente che non implementano RFC 5987 :

Content-Disposition: attachment;
                     filename="EURO rates";
                     filename*=utf-8''%e2%82%ac%20rates

Nota: quegli agenti utente che non supportano la codifica RFC 5987 ignorano " filename*" quando si verifica dopo " filename".

In Appendice D c'è anche una lunga lista di suggerimenti per aumentare l'interoperabilità. Indica anche un sito che confronta le implementazioni . I test all-pass correnti adatti per nomi di file comuni includono:

  • attwithisofnplain : nome file ISO-8859-1 semplice con virgolette doppie e senza codifica. Ciò richiede un nome file che sia tutto ISO-8859-1 e che non contenga segni di percentuale, almeno non davanti a cifre esadecimali.
  • attfnboth : due parametri nell'ordine sopra descritto. Dovrebbe funzionare per la maggior parte dei nomi di file sulla maggior parte dei browser, anche se IE8 utilizzerà il filenameparametro " ".

Quel RFC 5987 a sua volta fa riferimento a RFC 2231 , che descrive il formato effettivo. 2231 è principalmente per la posta e 5987 ci dice quali parti possono essere utilizzate anche per le intestazioni HTTP. Non confonderlo con le intestazioni MIME utilizzate all'interno di un corpomultipart/form-data HTTP , regolato da RFC 2388 ( in particolare la sezione 4.4 ) e dalla bozza HTML 5 .


1
Ho avuto problemi in Safari. Durante il download di file con nomi russi sono stati ricevuti caratteri errati e illeggibili. La soluzione ha aiutato. Ma dobbiamo inviare un'intestazione in una sola riga (!!!).
— evtuhovdo,

16

Il seguente documento collegato dal progetto di RFC menzionato da Jim nella sua risposta affronta ulteriormente la domanda e merita sicuramente una nota diretta qui:

Casi di test per intestazione di disposizione del contenuto HTTP e codifica RFC 2231/2047


Si noti che è possibile fornire entrambi i modi per codificare il parametro nomefile e che sembrano funzionare correttamente con vecchi browser e nuovi browser (in questo caso il vecchio è MSIE8 e Safari). Controlla attfnboth nel rapporto menzionato da @AtifAziz.
— Pablo Montilla,

11

in asp.net mvc2 uso qualcosa del genere:

return File(
    tempFile
    , "application/octet-stream"
    , HttpUtility.UrlPathEncode(fileName)
    );

Immagino che se non usi mvc (2) potresti semplicemente codificare il nome del file usando

HttpUtility.UrlPathEncode(fileName)

2
La codifica URL per la codifica del nome file non è valida, i browser non devono url decodificarli.
— SerialSeb,

IE 11 sicuramente non decodifica la codifica dell'URL in questo campo.
— pseudocoder

Ma doveva essere UrlEncoded quando il browser è Chrome o IE, altri come FF, Safari e Opera funzionano bene senza codifica
— Reza

11

Inserisci il nome del file tra virgolette. Risolto il problema per me Come questo:

Content-Disposition: attachment; filename="My Report.doc"

http://kb.mozillazine.org/Filenames_with_spaces_are_truncated_upon_download

Ho testato più opzioni. I browser non supportano le specifiche e agiscono diversamente, credo che le doppie virgolette siano l'opzione migliore.


3
Questo purtroppo non risolve tutti i problemi spiegati nelle risposte sopra.
— Luca Steeb,

2
Questo vi permetterà di restituire un nome di file con gli spazi, &, %, #ecc Quindi si risolve questo.
— Don Cheadle,

Che cosa succede se il nome file contiene virgolette doppie (sì, ciò può accadere), come specificato in RFC 6266, il nome file è una "stringa tra virgolette" e come specificato in RFC 2616 virgolette doppie all'interno di una stringa tra virgolette dovrebbe essere evitato con una barra rovesciata.
— Christophe Roussy,

10

Uso i seguenti frammenti di codice per la codifica (supponendo che fileName contenga il nome file e l'estensione del file, ovvero: test.txt):


PHP:

if ( strpos ( $_SERVER [ 'HTTP_USER_AGENT' ], "MSIE" ) > 0 )
{
     header ( 'Content-Disposition: attachment; filename="' . rawurlencode ( $fileName ) . '"' );
}
else
{
     header( 'Content-Disposition: attachment; filename*=UTF-8\'\'' . rawurlencode ( $fileName ) );
}

Giava:

fileName = request.getHeader ( "user-agent" ).contains ( "MSIE" ) ? URLEncoder.encode ( fileName, "utf-8") : MimeUtility.encodeWord ( fileName );
response.setHeader ( "Content-disposition", "attachment; filename=\"" + fileName + "\"");

Bene, dovrebbe essere rawurlencodein PHP almeno per l' filename*=intestazione di disposizione poiché value-charsutilizzata in ext-valueRFC 6266-> RFC 5987 (vedi tools.ietf.org/html/rfc6266#section-4.1 & tools.ietf.org/html/rfc5987#section -3.2.1 ) non consente lo spazio senza fuga percentuale ( filename=d'altra parte, sembra che potrebbe consentire uno spazio senza fuga, anche se qui dovrebbe essere presente solo ASCII). Non è necessario codificare con la massima rigidezza di rawurlencode, quindi alcuni caratteri possono essere sfuggiti a
— Brett Zamir,

9

Nell'API Web ASP.NET, url codifico il nome del file:

public static class HttpRequestMessageExtensions
{
    public static HttpResponseMessage CreateFileResponse(this HttpRequestMessage request, byte[] data, string filename, string mediaType)
    {
        HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
        var stream = new MemoryStream(data);
        stream.Position = 0;

        response.Content = new StreamContent(stream);

        response.Content.Headers.ContentType = 
            new MediaTypeHeaderValue(mediaType);

        // URL-Encode filename
        // Fixes behavior in IE, that filenames with non US-ASCII characters
        // stay correct (not "_utf-8_.......=_=").
        var encodedFilename = HttpUtility.UrlEncode(filename, Encoding.UTF8);

        response.Content.Headers.ContentDisposition =
            new ContentDispositionHeaderValue("attachment") { FileName = encodedFilename };
        return response;
    }
}

IE 9 Non riparato
IE 9 fisso


5

Ho testato il seguente codice in tutti i principali browser, inclusi gli Explorer più vecchi (tramite la modalità di compatibilità), e funziona bene ovunque:

$filename = $_GET['file']; //this string from $_GET is already decoded
if (strstr($_SERVER['HTTP_USER_AGENT'],"MSIE"))
  $filename = rawurlencode($filename);
header('Content-Disposition: attachment; filename="'.$filename.'"');

5

Ho finito con il seguente codice nel mio script "download.php" (basato su questo post sul blog e su questi casi di test ).

$il1_filename = utf8_decode($filename);
$to_underscore = "\"\\#*;:|<>/?";
$safe_filename = strtr($il1_filename, $to_underscore, str_repeat("_", strlen($to_underscore)));

header("Content-Disposition: attachment; filename=\"$safe_filename\""
.( $safe_filename === $filename ? "" : "; filename*=UTF-8''".rawurlencode($filename) ));

Questo utilizza il modo standard di nomefile = "..." purché vengano usati solo caratteri iso-latini1 e "sicuri"; in caso contrario, aggiunge il nome file * = UTF-8 '' codificato in url. Secondo questo specifico test case , dovrebbe funzionare da MSIE9 in su, e su FF, Chrome, Safari recenti; nella versione MSIE inferiore, dovrebbe offrire il nome file contenente la versione ISO8859-1 del nome file, con caratteri di sottolineatura sui caratteri non inclusi in questa codifica.

Nota finale: il massimo. la dimensione per ciascun campo di intestazione è 8190 byte su apache. UTF-8 può contenere fino a quattro byte per carattere; dopo rawurlencode, è x3 = 12 byte per un carattere. Abbastanza inefficiente, ma teoricamente dovrebbe essere possibile avere più di 600 "sorrisi"% F0% 9F% 98% 81 nel nome del file.


... ma la lunghezza massima del nome file trasferibile dipende anche dal client. Ho appena scoperto che al massimo [89 smiles😁] .pdf nomefile passa attraverso MSIE11. In Firefox37, è al massimo [111x 😁] .pdf. Chrome41 tronca il nome del file al 110 ° sorriso. È interessante notare che il suffisso viene trasferito ok.
— apurkrt

5

Se stai usando un backend nodejs puoi usare il seguente codice che ho trovato qui

var fileName = 'my file(2).txt';
var header = "Content-Disposition: attachment; filename*=UTF-8''" 
             + encodeRFC5987ValueChars(fileName);

function encodeRFC5987ValueChars (str) {
    return encodeURIComponent(str).
        // Note that although RFC3986 reserves "!", RFC5987 does not,
        // so we do not need to escape it
        replace(/['()]/g, escape). // i.e., %27 %28 %29
        replace(/\*/g, '%2A').
            // The following are not required for percent-encoding per RFC5987, 
            // so we can allow for a little better readability over the wire: |`^
            replace(/%(?:7C|60|5E)/g, unescape);
}

1
Meglio usare encodeURI(str). Ad esempio con le date nel nome del file: encodeURIComponent('"Kornél Kovács 1/1/2016')=> "Kornél Kovács 1% 2F1% 2F2016" vs. encodeURI('"Kornél Kovács 1/1/2016')=> "Kornél Kovács 1/1/2016"
— gdibble

4

In PHP questo è stato per me (supponendo che il nome del file sia codificato UTF8):

header('Content-Disposition: attachment;'
    . 'filename="' . addslashes(utf8_decode($filename)) . '";'
    . 'filename*=utf-8\'\'' . rawurlencode($filename));

Testato su IE8-11, Firefox e Chrome.
Se il browser è in grado di interpretare il nome file * = utf-8 utilizzerà la versione UTF8 del nome file, altrimenti utilizzerà il nome file decodificato. Se il tuo nome file contiene caratteri che non possono essere rappresentati in ISO-8859-1, ti consigliamo di utilizzare iconvinvece.


3
Sebbene questo codice possa rispondere alla domanda, fornendo un contesto aggiuntivo per quanto riguarda il perché e / o il modo in cui risponde alla domanda migliorerebbe significativamente il suo valore a lungo termine. Si prega di modificare la risposta di aggiungere qualche spiegazione.
— Toby Speight,

2
Whoa, nessuna delle risposte di solo codice sopra è stata declassata o criticata in questo modo. Ho anche trovato il motivo per cui è stato già risposto abbastanza bene: IE non interpreta il nome file * = utf-8 ma necessita della versione ISO8859-1 del nome file, che offre questo script. Volevo solo dare ai pigri un semplice codice funzionante per PHP.
— Gustav,

Penso che questo sia stato ridimensionato perché la domanda non è specifica della lingua ma su quali RFC attenersi durante l'implementazione della codifica dell'intestazione. Grazie comunque, per questa risposta, per PHP, questo codice ha fatto sparire i miei guai.
— j4k3,

Grazie. Questa risposta potrebbe non aver risposto rigorosamente alla domanda, ma era esattamente quello che stavo cercando e mi ha aiutato a risolvere il problema in Python.
— Lyndsy Simon,

1
Sono abbastanza sicuro che questo codice possa essere usato come vettore di attacco se l'utente può controllare il nome del file.
— Antti Haapala,

3

Solo un aggiornamento dal momento che stavo provando tutte queste cose oggi in risposta a un problema del cliente

  • Ad eccezione di Safari configurato per il giapponese, tutti i browser testati dai nostri clienti hanno funzionato meglio con nomefile = testo.pdf - dove testo è un valore cliente serializzato da ASP.Net/IIS in utf-8 senza codifica URL. Per qualche motivo, Safari configurato per l'inglese accetterebbe e salverebbe correttamente un file con nome giapponese utf-8 ma lo stesso browser configurato per il giapponese salverebbe il file con i caratteri utf-8 non interpretati. Tutti gli altri browser testati sembrano funzionare al meglio / bene (indipendentemente dalla configurazione della lingua) con il nome file utf-8 codificato senza codifica URL.
  • Non riuscivo a trovare un unico browser attuazione Rfc5987 / 8187 a tutti . Ho provato con le ultime versioni di Chrome, Firefox, più IE 11 e Edge. Ho provato a impostare l'intestazione solo con il nome file * = utf-8''texturlencoded.pdf, impostandolo con entrambi i nomi file = text.pdf; filename * = utf-8''texturlencoded.pdf. Nessuna delle funzionalità di Rfc5987 / 8187 sembrava essere stata elaborata correttamente in nessuno dei precedenti.

Questo è un buon aggiornamento Puoi approfondire i test specifici che hai provato?
— Brad,

3

PHP framework Symfony 4 ha $filenameFallbackin HeaderUtils::makeDisposition. Puoi esaminare questa funzione per i dettagli: è simile alle risposte sopra.

Esempio di utilizzo:

$filenameFallback = preg_replace('#^.*\.#', md5($filename) . '.', $filename);
$disposition = $response->headers->makeDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, $filename, $filenameFallback);
$response->headers->set('Content-Disposition', $disposition);

1

Soluzione ASP classica

La maggior parte dei browser moderni supporta il passaggio Filenamecome UTF-8adesso, ma come nel caso di una soluzione di caricamento file che uso basata su FreeASPUpload.Net (il sito non esiste più, il collegamento punta a archive.org ) non funzionerebbe come l'analisi del binario si basava sulla lettura di stringhe con codifica ASCII a byte singolo, che funzionava bene quando si passavano i dati con codifica UTF-8 fino ad arrivare ai caratteri che ASCII non supporta.

Tuttavia sono stato in grado di trovare una soluzione per ottenere il codice per leggere e analizzare il file binario come UTF-8.

Public Function BytesToString(bytes)    'UTF-8..
  Dim bslen
  Dim i, k , N 
  Dim b , count 
  Dim str

  bslen = LenB(bytes)
  str=""

  i = 0
  Do While i < bslen
    b = AscB(MidB(bytes,i+1,1))

    If (b And &HFC) = &HFC Then
      count = 6
      N = b And &H1
    ElseIf (b And &HF8) = &HF8 Then
      count = 5
      N = b And &H3
    ElseIf (b And &HF0) = &HF0 Then
      count = 4
      N = b And &H7
    ElseIf (b And &HE0) = &HE0 Then
      count = 3
      N = b And &HF
    ElseIf (b And &HC0) = &HC0 Then
      count = 2
      N = b And &H1F
    Else
      count = 1
      str = str & Chr(b)
    End If

    If i + count - 1 > bslen Then
      str = str&"?"
      Exit Do
    End If

    If count>1 then
      For k = 1 To count - 1
        b = AscB(MidB(bytes,i+k+1,1))
        N = N * &H40 + (b And &H3F)
      Next
      str = str & ChrW(N)
    End If
    i = i + count
  Loop

  BytesToString = str
End Function

Il merito va al puro caricamento di file ASP implementando la BytesToString()funzione include_aspuploader.aspnel mio codice sono stato in grado di far UTF-8funzionare i nomi dei file.


link utili


-1

Abbiamo riscontrato un problema simile in un'applicazione Web e abbiamo finito per leggere il nome file dall'HTML <input type="file">e impostarlo nel modulo con codifica URL in un nuovo HTML <input type="hidden">. Ovviamente abbiamo dovuto rimuovere il percorso come "C: \ fakepath \" restituito da alcuni browser.

Naturalmente questo non risponde direttamente alla domanda dei PO, ma può essere una soluzione per gli altri.


1
Problema completamente diverso. La domanda riguarda il download , la tua risposta riguarda il caricamento .
— Oskar Berggren,

-3

Normalmente codifico URL (con% xx) i nomi dei file e sembra funzionare in tutti i browser. Potresti voler fare comunque dei test.


10
Ho fatto il test in pochi e non funziona così in tutti i browser, quindi la domanda. :)
— Atif Aziz,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.