¿Cómo codificar el parámetro del nombre de archivo del encabezado Content-Disposition en HTTP?

535

Las aplicaciones web que desean forzar la descarga de un recurso en lugar de representarlo directamente en un navegador web emiten un Content-Dispositionencabezado en la respuesta HTTP del formulario:

Content-Disposition: attachment; filename=FILENAME

El filenameparámetro puede usarse para sugerir un nombre para el archivo en el que el navegador descarga el recurso. RFC 2183 (Content-Disposition), sin embargo, establece en la sección 2.3 (El parámetro de nombre de archivo) que el nombre de archivo solo puede usar caracteres US-ASCII:

La gramática actual [RFC 2045] restringe los valores de los parámetros (y, por lo tanto, los nombres de los archivos de disposición de contenido) a US-ASCII. Reconocemos la gran conveniencia de permitir conjuntos de caracteres arbitrarios en los nombres de archivo, pero está fuera del alcance de este documento definir los mecanismos necesarios.

Sin embargo, existe evidencia empírica de que los navegadores web más populares de hoy en día parecen permitir caracteres que no son ASCII de EE. UU. Pero (por falta de un estándar) no están de acuerdo con el esquema de codificación y la especificación del juego de caracteres del nombre del archivo. La pregunta es, entonces, ¿cuáles son los diversos esquemas y codificaciones empleados por los navegadores populares si el nombre de archivo "naïvefile" (sin comillas y donde la tercera letra es U + 00EF) necesita codificarse en el encabezado Content-Disposition?

A los efectos de esta pregunta, los navegadores populares son:

  • Firefox
  • explorador de Internet
  • Safari
  • Google Chrome
  • Ópera
Atif Aziz
fuente
Lo tengo funcionando para Mobile Safari (utf-8 sin procesar como lo sugiere @Martin Ørding-Thomsen), pero eso no funciona para GoodReader desde el mismo dispositivo. ¿Algunas ideas?
Thilo
También vea esta pregunta similar
juergen d
1
La respuesta de Kornel demostró ser el camino de menor resistencia, si puede establecer el último segmento del camino; esta pareja con Content-Disposition: attachment.
Antti Haapala

Respuestas:

94

Se discute esto, incluidos los enlaces a las pruebas del navegador y la compatibilidad con versiones anteriores, en el RFC 5987 propuesto , "Conjunto de caracteres y codificación de idioma para parámetros de campo de encabezado del protocolo de transferencia de hipertexto (HTTP)".

RFC 2183 indica que dichos encabezados deben codificarse de acuerdo con RFC 2184 , que estaba obsoleto por RFC 2231 , cubierto por el borrador de RFC anterior.

Jim
fuente
55
También tenga en cuenta que el borrador de Internet (no "borrador RFC") ha finalizado, y el documento final es RFC 5987 ( greenbytes.de/tech/webdav/rfc5987.html )
Julian Reschke
11
En relación con esto, descubrí que Firefox (versiones 4-9 inclusive) se rompe si hay una coma (,) en el nombre del archivo, por ejemplo Content-Disposition: filename="foo, bar.pdf". El resultado es que firefox descarga el archivo correctamente pero mantiene la .partextensión (p foo,bar.pdf-1.part. Ej .). Entonces, por supuesto, el archivo no se abrirá correctamente porque la aplicación no está asociada .part. Otros caracteres ASCII parecen funcionar bien.
catchdave
3
Para obtener más información sobre el comportamiento de IE, consulte blogs.msdn.com/b/ieinternals/archive/2010/06/07/…
EricLaw
55
@catchdave: Has olvidado el "archivo adjunto"; parte.
Christoffer Hammarström
66
Con todo, esto no es más que una respuesta de solo enlace con 74 votos a favor.
Antti Haapala
364

Sé que esta es una publicación antigua pero sigue siendo muy relevante. He descubierto que los navegadores modernos son compatibles con rfc5987, que permite la codificación utf-8, codificada en porcentaje (codificada en url). Entonces Naïve file.txt se convierte en:

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

Safari (5) no es compatible con esto. En su lugar, debe usar el estándar Safari para escribir el nombre del archivo directamente en su encabezado codificado utf-8:

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

IE8 y versiones anteriores tampoco lo admiten y debe usar el estándar IE de codificación utf-8, codificado porcentual:

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

En ASP.Net utilizo el siguiente código:

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);

Probé lo anterior usando IE7, IE8, IE9, Chrome 13, Opera 11, FF5, Safari 5.

Actualización de noviembre de 2013:

Aquí está el código que uso actualmente. Todavía tengo que soportar IE8, así que no puedo deshacerme de la primera parte. Resulta que los navegadores en Android usan el administrador de descargas de Android incorporado y no pueden analizar de manera confiable los nombres de archivos de la manera estándar.

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);

Lo anterior ahora probado en IE7-11, Chrome 32, Opera 12, FF25, Safari 6, usando este nombre de archivo para descargar: 你好 abcABCæøåÆØÅäöüïëêîâéíáóúýñ½§! # ¤% & () = `@ £ $ € {[]} + ´¨ ^ ~ '-_,;. txt

En IE7 funciona para algunos caracteres pero no para todos. ¿Pero a quién le importa IE7 hoy en día?

Esta es la función que uso para generar nombres de archivos seguros para Android. Tenga en cuenta que no sé qué caracteres son compatibles con Android, pero he probado que estos funcionan con seguridad:

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: Probé en IE7 e IE8 y resultó que no necesitaba escapar del apóstrofe ('). ¿Tienes un ejemplo donde falla?

@Dave Van den Eynde: la combinación de los dos nombres de archivo en una línea de acuerdo con RFC6266 funciona a excepción de Android e IE7 + 8 y he actualizado el código para reflejar esto. Gracias por la sugerencia.

@Thilo: No tengo idea sobre GoodReader o cualquier otro no navegador. Es posible que tenga suerte con el enfoque de Android.

@ Alex Zhukovskiy: No sé por qué, pero como se discutió en Connect , no parece funcionar muy bien.

Martin Ørding-Thomsen
fuente
1
Lo hizo funcionar para Mobile Safari (utf-8 sin procesar como se sugirió anteriormente), pero eso no funciona para GoodReader desde el mismo dispositivo. ¿Algunas ideas?
Thilo
1
IE7 y 8 también necesitan apóstrofes escapados: .Replace ("'", Uri.HexEscape (' \ ''))
TomZ
1
Escribir directamente caracteres UTF-8 parece funcionar para las versiones actuales de Firefox, Chrome y Opera. No probé Safari e IE.
Martin Tournoij
21
¿Por qué no combinarlos, Content-Disposition: attachment; filename*=UTF-8''Na%C3%AFve%20file.txt; filename=Na%C3%AFve%20file.txty omitir el navegador olfateando? Funcionaría eso?
Dave Van den Eynde
99
La gente amable de fastmail encontró otra solución: blog.fastmail.com/2011/06/24/download-non-english-filenames Content-Disposition: adjunto; filename = "foo-% c3% a4.html"; filename * = UTF-8''foo-% c3% a4.html Especificar el nombre del archivo dos veces (una vez sin el prefijo UTF-8 y una vez con) hace que funcione en IE8-11, Edge, Chrome, Firefox y Safari ( parece un safari fijo de Apple, así que ahora funciona allí también)
wullinkm
169

Hay una alternativa simple y muy robusta: use una URL que contenga el nombre de archivo que desee .

Cuando el nombre después de la última barra es el que desea, ¡no necesita encabezados adicionales!

Este truco funciona:

/real_script.php/fake_filename.doc

Y si su servidor admite la reescritura de URL (por ejemplo, mod_rewriteen Apache), puede ocultar completamente la parte del script.

Los caracteres en las URL deben estar en UTF-8, codificados por bytes:

/mot%C3%B6rhead   # motörhead
Kornel
fuente
3
Pruebe GetAttachment.aspx / fake_filename.doc? Id = 34 (aunque podría ser un capricho exclusivo de Apache)
Kornel
2
Esta es una solución fantástica; Realmente me ayudó mucho. Gracias.
kristopolous
66
Seguí el camino del conejo y probé algunas de las otras soluciones; intentar detectar el navegador y la versión correctos para configurar los encabezados correctamente es una pesadilla. Chrome se identificó incorrectamente como Safari, lo que no se comporta de la misma manera (se rompe con comas si no se codifica correctamente). Ahórrese el problema, use esta solución y coloque el alias de la URL según sea necesario.
mpen
3
El /:id/:filenamemétodo es realmente simple y funciona, ¡gracias!
Luca Steeb
2
Mil veces "Sí". En serio ganarás tiempo con esto. Más aun - algunos navegadores de Android de plano ignorar el Content-Dispositiony crear nombres de archivo muy interesantes en su lugar (que se generan a partir de su trayectoria). Entonces, la única solución para mantener la cordura es simplemente configurar Content-Disposition: attachmenty pasar el nombre de archivo deseado como el último componente de la ruta:
Julik
73

RFC 6266 describe el " Uso del campo de encabezado de disposición de contenido en el Protocolo de transferencia de hipertexto (HTTP) ". Citando de eso:

6. Consideraciones de internacionalización

El filename*parámetro " " ( Sección 4.3 ), utilizando la codificación definida en [ RFC5987 ], permite al servidor transmitir caracteres fuera del juego de caracteres ISO-8859-1, y también especificar opcionalmente el idioma en uso.

Y en su sección de ejemplos :

Este ejemplo es el mismo que el anterior, pero agrega el parámetro "nombre de archivo" para compatibilidad con agentes de usuario que no implementan RFC 5987 :

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

Nota: Los agentes de usuario que no admiten la codificación RFC 5987 ignoran " filename*" cuando ocurre después de " filename".

En el Apéndice D también hay una larga lista de sugerencias para aumentar la interoperabilidad. También apunta a un sitio que compara implementaciones . Las pruebas actuales aprobadas para todos los nombres de archivos comunes incluyen:

  • attwithisofnplain : nombre de archivo ISO-8859-1 simple con comillas dobles y sin codificación. Esto requiere un nombre de archivo que sea todo ISO-8859-1 y no contenga signos de porcentaje, al menos no delante de dígitos hexadecimales.
  • attfnboth : dos parámetros en el orden descrito anteriormente. Debería funcionar para la mayoría de los nombres de archivos en la mayoría de los navegadores, aunque IE8 utilizará el filenameparámetro " ".

Ese RFC 5987 a su vez hace referencia al RFC 2231 , que describe el formato real. 2231 es principalmente para correo, y 5987 nos dice qué partes pueden usarse también para encabezados HTTP. No confunda esto con los encabezados MIME utilizados dentro de un cuerpomultipart/form-data HTTP , que se rige por RFC 2388 ( sección 4.4 en particular) y el borrador HTML 5 .

MvG
fuente
1
Tuve problemas en Safari. Al descargar archivos con nombres rusos recibió caracteres erróneos e ilegibles. La solución ha ayudado. Pero necesitamos enviar un encabezado en una sola fila (!!!).
evtuhovdo
16

El siguiente documento vinculado desde el borrador de RFC mencionado por Jim en su respuesta aborda la pregunta y definitivamente vale la pena una nota directa aquí:

Casos de prueba para encabezado de disposición de contenido HTTP y codificación RFC 2231/2047

Atif Aziz
fuente
Tenga en cuenta que uno puede proporcionar ambas formas de codificar el parámetro de nombre de archivo, y que parecen funcionar correctamente con navegadores antiguos y nuevos (en este caso, MSIE8 y Safari eran antiguos). Verifique attfnboth en el informe mencionado por @AtifAziz.
Pablo Montilla
11

en asp.net mvc2 uso algo como esto:

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

Supongo que si no usas mvc (2) podrías codificar el nombre de archivo usando

HttpUtility.UrlPathEncode(fileName)
Elmer
fuente
2
La codificación de URL para la codificación de nombre de archivo no es válida, los navegadores no deben decodificarla.
SerialSeb
IE 11 definitivamente no decodifica la codificación de URL en este campo.
pseudocoder
Pero tenía que estar codificado en Url cuando el navegador es Chrome o IE, otros como FF, Safari y Opera funcionan bien sin codificación
Reza
11

Ponga el nombre del archivo entre comillas dobles. Resolvió el problema para mí. Me gusta esto:

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

http://kb.mozillazine.org/Filenames_with_spaces_are_truncated_upon_download

He probado múltiples opciones. Los navegadores no admiten las especificaciones y actúan de manera diferente, creo que las comillas dobles son la mejor opción.

Dmitry Kaigorodov
fuente
3
Lamentablemente, esto no resuelve todos los problemas explicados en las respuestas anteriores.
Luca Steeb
2
Esto le permitirá volver un nombre de archivo con espacios, &, %, #etc Por lo tanto soluciona.
Don Cheadle
¿Qué sucede si el nombre de archivo contiene comillas dobles?
Christophe Roussy
10

Utilizo los siguientes fragmentos de código para codificar (suponiendo que fileName contiene el nombre de archivo y la extensión del archivo, es decir: 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 ) );
}

Java:

fileName = request.getHeader ( "user-agent" ).contains ( "MSIE" ) ? URLEncoder.encode ( fileName, "utf-8") : MimeUtility.encodeWord ( fileName );
response.setHeader ( "Content-disposition", "attachment; filename=\"" + fileName + "\"");
Vasilen Donchev
fuente
Correcto, debe estar rawurlencodeen PHP al menos para el filename*=encabezado de disposición, ya que se value-charsutiliza en ext-valueRFC 6266-> RFC 5987 (consulte tools.ietf.org/html/rfc6266#section-4.1 & tools.ietf.org/html/rfc5987#section -3.2.1 ) no permite espacio sin un porcentaje de escape ( filename=, por otro lado, parece que podría permitir un espacio sin escapar en absoluto, aunque solo ASCII debería estar presente aquí). No es necesario codificar con toda la rigurosidad del código rawurlen, por lo que algunos caracteres pueden quedar libres
Brett Zamir
9

En ASP.NET Web API, codifico el nombre del archivo url:

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 no arreglado
IE 9 fijo

martinoss
fuente
5

Probé el siguiente código en todos los principales navegadores, incluidos los exploradores más antiguos (a través del modo de compatibilidad), y funciona bien en todas partes:

$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.'"');
Stano
fuente
5

Terminé con el siguiente código en mi script "download.php" (basado en esta publicación de blog y estos casos de prueba ).

$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) ));

Utiliza la forma estándar de filename = "..." siempre que solo se usen caracteres iso-latin1 y "seguros"; si no, agrega el nombre de archivo * = UTF-8 '' codificado en url. De acuerdo con este caso de prueba específico , debería funcionar desde MSIE9 en adelante, y en FF reciente, Chrome, Safari; en la versión inferior de MSIE, debe ofrecer un nombre de archivo que contenga la versión ISO8859-1 del nombre de archivo, con guiones bajos en caracteres que no están en esta codificación.

Nota final: el max. El tamaño de cada campo de encabezado es de 8190 bytes en Apache. UTF-8 puede tener hasta cuatro bytes por carácter; después de rawurlencode, es x3 = 12 bytes por un caracter. Bastante ineficiente, pero debería ser teóricamente posible tener más de 600 "sonrisas"% F0% 9F% 98% 81 en el nombre del archivo.

apurkrt
fuente
... pero la longitud máxima de nombre de archivo transferible también depende del cliente. Me acabo de enterar de que a lo sumo [89 sonrisas😁] .pdf el nombre de archivo pasa por MSIE11. En Firefox37, es como máximo [111x 😁] .pdf. Chrome41 trunca el nombre del archivo en la sonrisa número 110. Curiosamente, el sufijo se transfiere ok.
apurkrt
5

Si está utilizando un backend de nodejs, puede usar el siguiente código que encontré aquí

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);
}
Emanuele Spatola
fuente
1
Mejor de usar encodeURI(str). Como ejemplo con fechas en el nombre del archivo: 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

En PHP esto lo hizo por mí (suponiendo que el nombre del archivo esté codificado en UTF8):

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

Probado contra IE8-11, Firefox y Chrome.
Si el navegador puede interpretar el nombre de archivo * = utf-8 , usará la versión UTF8 del nombre de archivo; de lo contrario, usará el nombre de archivo descodificado. Si su nombre de archivo contiene caracteres que no se pueden representar en ISO-8859-1, puede considerar usarlos iconv.

Gustav
fuente
3
Aunque este código puede responder a la pregunta, proporcionar un contexto adicional con respecto a por qué y / o cómo responde la pregunta mejoraría significativamente su valor a largo plazo. Por favor, editar su respuesta a añadir un poco de explicación.
Toby Speight
2
Whoa, ninguna de las respuestas de solo código anterior fue rechazada o criticada de esa manera. También encontré el por qué ya se respondió bastante bien: IE no interpreta el nombre de archivo * = utf-8 pero necesita la versión ISO8859-1 del nombre de archivo, que ofrece este script. Solo quería darle a los vagos un código simple y funcional para PHP.
Gustav
Creo que esto se votó negativamente porque la pregunta no es específica del idioma, sino sobre qué RFC deben cumplir al implementar la codificación del encabezado. Sin embargo, gracias por esta respuesta, para PHP, este código hizo que mis problemas desaparecieran.
j4k3
Gracias. Es posible que esta respuesta no haya respondido estrictamente a la pregunta, pero era exactamente lo que estaba buscando y me ayudó a resolver el problema en Python.
Lyndsy Simon
1
Estoy bastante seguro de que este código puede usarse como un vector de ataque si el usuario puede controlar el nombre del archivo.
Antti Haapala
3

Solo una actualización ya que estaba probando todo esto hoy en respuesta a un problema del cliente

  • Con la excepción de Safari configurado para japonés, todos los navegadores que nuestro cliente probó funcionaron mejor con filename = text.pdf, donde el texto es un valor de cliente serializado por ASP.Net/IIS en utf-8 sin codificación de URL. Por alguna razón, Safari configurado para inglés aceptaría y guardaría correctamente un archivo con el nombre japonés utf-8, pero ese mismo navegador configurado para japonés guardaría el archivo con los caracteres utf-8 sin interpretar. Todos los demás navegadores probados parecían funcionar mejor / bien (independientemente de la configuración del idioma) con el nombre de archivo utf-8 codificado sin codificación de URL.
  • No pude encontrar un solo navegador que implementara Rfc5987 / 8187 en absoluto . Probé con las últimas versiones de Chrome, Firefox más IE 11 y Edge. Intenté configurar el encabezado con solo nombre de archivo * = utf-8''texturlencoded.pdf, configurándolo con ambos nombre de archivo = text.pdf; filename * = utf-8''texturlencoded.pdf. Ninguna de las características de Rfc5987 / 8187 parecía procesarse correctamente en ninguna de las anteriores.
usuario1664043
fuente
Esta es una buena actualización. ¿Puedes dar más detalles sobre las pruebas específicas que probaste?
Brad
3

PHP framework Symfony 4 tiene $filenameFallbacken HeaderUtils::makeDisposition. Puede buscar detalles en esta función; es similar a las respuestas anteriores.

Ejemplo de uso:

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

Solución ASP clásica

La mayoría de los navegadores modernos admiten pasar el Filenamecomo UTF-8ahora, pero como fue el caso con una solución de carga de archivos que uso que se basa en FreeASPUpload.Net (el sitio ya no existe, los puntos de enlace a archive.org ) no funcionaría como el análisis del binario se basó en la lectura de cadenas codificadas ASCII de un solo byte, que funcionó bien cuando pasó los datos codificados UTF-8 hasta llegar a los caracteres que ASCII no admite.

Sin embargo, pude encontrar una solución para obtener el código para leer y analizar el binario como 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

El crédito se destina a Pure ASP File Upload mediante la implementación de la BytesToString()función desde include_aspuploader.aspmi propio código, pude hacer que los UTF-8nombres de archivo funcionen.


Enlaces útiles

Lankymart
fuente
-1

Tuvimos un problema similar en una aplicación web y terminamos leyendo el nombre de archivo del HTML <input type="file">y configurándolo en el formulario codificado en URL en un nuevo HTML <input type="hidden">. Por supuesto, tuvimos que eliminar la ruta como "C: \ fakepath \" que algunos navegadores devuelven.

Por supuesto, esto no responde directamente a la pregunta de los OP, pero puede ser una solución para otros.

Andrei I
fuente
1
Problema completamente diferente. La pregunta es sobre la descarga , su respuesta es sobre la carga .
Oskar Berggren
-3

Normalmente codifico URL (con% xx) los nombres de archivo, y parece funcionar en todos los navegadores. Es posible que desee hacer algunas pruebas de todos modos.

Dario Solera
fuente
10
Probé en algunos y no funciona de esa manera en todos los navegadores, de ahí la pregunta. :)
Atif Aziz