Descargar el archivo con “;” o “#” en nombre de archivo

Tengo un archivo llamado AttachmentDownload.aspx y dentro del método Page_Load tengo dicho código que ofrece descargar el archivo. Todos los nombres funcionan correctamente en IE excepto los nombres que incluyen “;” o “#”. Ofrecen al usuario guardar el archivo con el nombre “AttachmentDownload.aspx”. ¿Hay una solución para esto?

Aquí hay un ejemplo:

var fileName = Server.UrlPathEncode (";%.txt"); Response.AddHeader("content-disposition", String.Format("attachment;filename=\"{0}\"", fileName)); Response.WriteFile(path); Response.End(); 

UrlPathEncode solo codifica la porción “Ruta” de una cadena formada como URL, intente usar Server.UrlEncode o HttpUtility.UrlEncode .

Todos los nombres funcionan correctamente en IE excepto los nombres que incluyen “;” o “#”.

No puedo reproducir el problema con ‘#’ sino ‘;’ ciertamente lo rompe. As will ‘”‘ y ‘\’ (que puede tener en un nombre de archivo en Unix y que romperá su cadena entre comillas).

La solución “correcta” para incluir caracteres fuera de banda en un encabezado con parámetros de familia RFC822 como Content-Disposition se define en RFC1521 : las cadenas que no pueden estar contenidas en un ‘token’ deben estar envueltas en una cadena entrecomillada, que RFC2822 define como tener “y \ caracteres barra invertida-escapada, luego rodeado de comillas.

Luego, RFC2231 amplía esto con una forma muy complicada de incluir caracteres no ASCII en los parámetros del encabezado, que en teoría querría usar para soportar caracteres Unicode.

En la práctica: HTTP no es realmente una especificación de la familia RFC822, y nada de esto funciona en navegadores comunes (excepto los backslash-escapes en Opera). No hay una manera confiable de obtener un nombre de archivo de contenido-disposición Unicode para el cliente, y su problema con ‘;’ no existe debido a ningún problema de escape, sino simplemente porque IE no puede analizar encabezados parametrizados para toffee (se divide en el siguiente punto y coma de la cadena, incluso si está rodeado de comillas).

Para una configuración de nombres de navegador cruzada confiable, hay dos enfoques que puede tomar en el mundo real:

  1. Elimine todo lo ofensivo de los nombres de archivos antes de colocarlos en un encabezado de disposición de contenido. Esto incluye espacios / puntos iniciales / finales, la mayoría de los signos de puntuación y cualquier otro elemento que no sea ASCII.

  2. No especifique ningún nombre de archivo en el encabezado Content-Disposition y deje que el navegador determine qué nombre de archivo usar en la última parte de la URL. Para evitar que elija “AttachmentDownload.aspx”, puede poner lo que quiera como parte de la URL final, por ejemplo:

    http://www.example.com/AttachmentDownload.aspx/Foo%23Bar

Esto requiere que codifique la mayoría de los signos de puntuación utilizando encoding URL simple y caracteres Unicode con UTF-8, pero al menos puede obtener los caracteres. Lo anterior da como resultado una solicitud de descarga de archivos para ‘Foo; Bar’.

Tenga en cuenta que aunque puede codificar caracteres poco amigables para Windows como ” ” en una parte de ruta URL como esta, para archivos descargados es mejor no hacerlo, porque IE responderá al intentar guardar el archivo usando ” ‘en el nombre de archivo y fracasará silenciosa y misteriosamente en respuesta.

Empecé a limpiar mis nombres de archivo de todos los personajes especiales. He creado una tabla de mapeo que debe mapear la mayoría de los caracteres usados ​​comúnmente.

 //http://www.pjb.com.au/comp/diacritics.html private static string[,] CharacterReplacements = { { " ", "-"}, { "&", "-"}, { "?", "-"}, { "!", "-"}, { "%", "-"}, { "+", "-"}, { "#", "-"}, { ":", "-"}, { ";", "-"}, { ".", "-"}, { "¢", "c" }, //cent { "£", "P" }, //Pound { "€", "E" }, //Euro { "¥", "Y" }, //Yen { "°", "d" }, //degree { "¼", "1-4" }, //fraction one-quarter { "½", "1-2" }, //fraction half { "¾", "1-3" }, //fraction three-quarters} { "@", "AT)"}, //at { "Œ", "OE" }, //OE ligature, French (in ISO-8859-15) { "œ", "oe" }, //OE ligature, French (in ISO-8859-15) {"Å","A" }, //ring {"Æ","AE"}, //diphthong {"Ç","C" }, //cedilla {"È","E" }, //grave accent {"É","E" }, //acute accent {"Ê","E" }, //circumflex accent {"Ë","E" }, //umlaut mark {"Ì","I" }, //grave accent {"Í","I" }, //acute accent {"Î","I" }, //circumflex accent {"Ï","I" }, //umlaut mark {"Ð","Eth"}, //Icelandic {"Ñ","N" }, //tilde {"Ò","O" }, //grave accent {"Ó","O" }, //acute accent {"Ô","O" }, //circumflex accent {"Õ","O" }, //tilde {"Ö","O" }, //umlaut mark {"Ø","O" }, //slash {"Ù","U" }, //grave accent {"Ú","U" }, //acute accent {"Û","U" }, //circumflex accent {"Ü","U" }, //umlaut mark {"Ý","Y" }, //acute accent {"Þ","eth"}, //Icelandic - http://en.wikipedia.org/wiki/Thorn_(letter) {"ß","ss"}, //German {"à","a" }, //grave accent {"á","a" }, //acute accent {"â","a" }, //circumflex accent {"ã","a" }, //tilde {"ä","ae"}, //umlaut mark {"å","a" }, //ring {"æ","ae"}, //diphthong {"ç","c" }, //cedilla {"è","e" }, //grave accent {"é","e" }, //acute accent {"ê","e" }, //circumflex accent {"ë","e" }, //umlaut mark {"ì","i" }, //grave accent {"í","i" }, //acute accent {"î","i" }, //circumflex accent {"ï","i" }, //umlaut mark {"ð","eth"}, //Icelandic {"ñ","n" }, //tilde {"ò","o" }, //grave accent {"ó","o" }, //acute accent {"ô","o" }, //circumflex accent {"õ","o" }, //tilde {"ö","oe"}, //umlaut mark {"ø","o" }, //slash {"ù","u" }, //grave accent {"ú","u" }, //acute accent {"û","u" }, //circumflex accent {"ü","ue"}, //umlaut mark {"ý","y" }, //acute accent {"þ","eth"}, //Icelandic - http://en.wikipedia.org/wiki/Thorn_(letter) {"ÿ","y" }, //umlaut mark }; 

O puede obtener el código completo aquí:

http://remy.supertext.ch/2012/08/clean-filenames/

Avíseme si encuentra caracteres faltantes.

Los nombres de archivo con símbolos especiales (p. Ej., Espacio; # @! $) O caracteres no Unicode no pueden ser compatibles con algunos navegadores o causar un nombre de archivo incorrecto en el equipo del cliente. Aquí hay un artículo de un chino llamado chanext, que dio una forma perfecta de resolver este problema: este artículo dio un código de muestra (escrito con c #) para mostrar cómo obtener la solución perfecta a este problema en los cuatro buscadores populares (IE; Opera; Firefox y Chrome), el nombre del archivo “Microsoft.Asp.Net.doc” y “F ile ;;! @% # ^ & Y.doc” pueden mostrarse correctamente utilizando la forma que el autor proporcionó en este artículo.

http://ciznx.com/post/aspnetstreamdownloaddisplaynonunicodespacechar.aspx