33 votes

Caractères spéciaux dans Content-Disposition de nom de fichier

Ce fil est un doublon de la Façon de coder le paramètre le nom de fichier de l'-tête Content-Disposition en HTTP? Mais depuis que cette question a été posée il y a longtemps et il n'y a toujours pas de réponse satisfaisante (à mon avis), je voudrais vous demander à nouveau.

Je développe en C++ CGI application qui offre les fichiers qui peuvent contenir des caractères spéciaux en leurs noms comme
"bizarre # € = { } ; filename.txt"

Il semble y avoir aucune possibilité de définir le Contenu HTTP-Dispostion dans une manière qui fonctionne pour tous les navigateurs comme

  • Internet Explorer
  • Firefox
  • Chrome
  • Opéra
  • Safari

Je serais heureux avec une solution différente pour chaque navigateur.
Maintenant que c'est la façon dont je suis venu:

Internet Explorer (ajouté des guillemets, et remplacé # et ; )

Content-Disposition: attachment; filename="weird %23 € = { } %3B filename.txt"

Firefox (guillemets semblent fonctionner. rien de plus à faire):

Content-Disposition: attachment; filename="weird # € = { } ; filename.txt"

Une autre alternative de travail:

Content-Disposition: attachment; filename*=UTF-8''weird%20%23%20%e2%82%ac%20%3D%20%7B%20%7D%20%3B%20filename.txt

Chrome

lors de l'utilisation de seulement les guillemets doubles ces problèmes se posent:

  • = disparait dans les noms de fichiers
  • € sera remplacé par

mais cela fonctionne:

Content-Disposition: attachment; filename*=UTF-8''weird%20%23%20%e2%82%ac%20%3D%20%7B%20%7D%20%3B%20filename.txt

Opéra

À l'aide de duoble guillemets ou en utilisant la syntaxe: nom de fichier*=UTF-8"... génère les problèmes suivants:

  • Plusieurs collé ensemble des espaces dans les noms de fichiers sont réduits à un seul
  • { et } disparaître: "ab{}cd.txt" -> "abcd.txt"
  • les noms de fichiers coupé après ; dans celui-ci: "abc ; def.txt" -> "abc"

EDIT 2: C'est à cause de nom de fichier des limites de longueur. Cette syntaxe fonctionne avec Opera:

Content-Disposition: attachment; filename*=UTF-8''weird%20%23%20%e2%82%ac%20%3D%20%7B%20%7D%20%3B%20filename.txt

Safari

  • € sera remplacé par un caractère invisible (à l'aide de guillemets)

    no solution that prevents that little problem
    

La suggestion de l'autre thread (mentionné ci-dessus) à l'aide de

Content-Disposition: attachment; filename*=UTF-8''weird%20%23%20%80%20%3D%20%7B%20%7D%20%3B%20filename.txt

ne fonctionne pas pour moi. Les caractères d'échappement ne sera pas traduit en arrière ou le navigateur veut enregistrer le fichier avec le nom de mon application cgi. C'était parce que mon codage a été mauvais. Je n'ai pas coder selon la RFC 5987. Mais Safari n'est pas l'utilisation de ce codage, de toute façon. Donc pas de solution pour l' € de caractère jusqu'à présent.

BTW: Un UTF-8 convertisseur http://www.rishida.net/tools/conversion/

J'ai utilisé la dernière version de tous les navigateurs fo ces tests:

  • Firefox 7
  • Internet Explorer 9
  • Chrome 15
  • L'opéra de 11,5
  • Safari 5.1

PS: j'ai essayé tous les caractères spéciaux sur mon clavier. J'ai utilisé dans ce fil de discussion seulement ceux qui ont fait de la difficulté.

EDIT:

J'ai aussi essayé un nom de fichier avec tous les caractères spéciaux sur mon clavier (qui sont possibles dans un nom de fichier) et qui n'a pas fonctionné comme il l'a fait avec la chaîne de test ci-dessus:

Test complet de la chaîne:

0 ! § $ % & ( ) = ` ´ { }    [ ] ² ³ @ € µ ^ ° ~ + ' # - _ . , ; ü ä ö ß 9.jpg

Codé Chaîne De Test:

0%20%21%20%C2%A7%20%24%20%25%20%26%20%28%20%29%20%3D%20%60%20%C2%B4%20%7B%20%7D%20%20%20%20%5B%20%5D%20%C2%B2%20%C2%B3%20%40%20%E2%82%AC%20%C2%B5%20%5E%20%C2%B0%20~%20%2B%20%27%20%23%20-%20_%20.%20%2C%20%3B%20%C3%BC%20%C3%A4%20%C3%B6%20%C3%9F%209.jpg

En utilisant cette méthode:

Content-Disposition: attachment; filename*=UTF-8''0%20%21%20%C2%A7%20%24%20%25%20%26%20%28%20%29%20%3D%20%60%20%C2%B4%20%7B%20%7D%20%20%20%20%5B%20%5D%20%C2%B2%20%C2%B3%20%40%20%E2%82%AC%20%C2%B5%20%5E%20%C2%B0%20~%20%2B%20%27%20%23%20-%20_%20.%20%2C%20%3B%20%C3%BC%20%C3%A4%20%C3%B6%20%C3%9F%209.jpg

J'ai eu les résultats suivants:

  • Firefox fonctionne
  • Chrome fonctionne
  • IE: $ % & ( ) = ` { } [ ] 2 3 @ € µ ^ ° ~ + ' # - _ . , ; ü ä ö ß 9.jpg (a enlevé les 6 premiers caractères). EDIT 2: C'est à cause de nom de fichier des limites de longueur du navigateur. Il commence à couper le nom de fichier à partir du début de la chaîne. Je n'ai pas aller en profondeur dans cet mais cela semble normal les noms de fichiers peuvent être d'environ 200 caractères et les noms de fichiers avec de nombreux échapper sequesnces encore plus, mais de moins de 250. Mais c'est OK.
  • Opéra: 0 ! § $ % & ( ) = ` [ ] 2 3 @ € µ ^ ° ~ + ' # - _ . , ; ü ä ö ß 9.jpg (manque quelques personnages comme avant). EDIT 2: j'ai raccourci mon test de la chaîne, car je soupçonne le nom de fichier de la longueur des "problèmes" avec l'Opéra qu'il y a avec IE et il y travaillait aussi.
  • Safari ne fonctionne pas avec cette syntaxe. Qui a été l'exception.

EDIT 2:

Statut jusqu'à présent, c'est que la syntaxe du nom de fichier*=UTF-8"filname séquence d'échappement" fonctionne avec tous les navigateurs à l'exception de Safari. Et le seul personnage qui est remplacé avec Safari est l' €. Je suppose que je peux vivre avec ça. Merci!!!!

EDIT 3: longueur du nom de fichier

J'ai remarqué quelques problèmes de longueur de nom de fichier.

  • Internet Explorer: les noms de Fichiers peuvent être 147 caractères. Si la chaîne ne contient pas de séquences d'échappement, alors que c'est la longueur du nom de fichier. Si elle ne le nom du fichier peut varier. Le nom de fichier résultant est plus courte que sur les 147 caractères. Mais il en diffère. J'ai utilisé 2 séquences d'échappement et le nom de fichier raccourcie de 5 caractères et j'ai utilisé de nombreuses séquences d'échappement et le nom de fichier raccourci onyl 2 caractères. Je ne pouvais pas trouver une règle ici.
  • Les autres navigateurs ne semble pas avoir ce problème. Ils seraient enregistrer le fichier, si le système de fichiers peut s'en occuper. J'ai essayé par exemple de 250 caractères et les navigateurs dit que je dois réduire le nom du fichier (Chrome) ou ils l'ont fait vis à vis de raccourcissement il soit 220 (Opéra) ou 210 (Firefox) caractères. L'opéra de couper le fichier qui se termine bien. Safari ont essayé de sauver ce nom de fichier long et finalement pas de l'enregistrer et de l'écriture "-1" dans la liste de téléchargement comme nom de fichier.

12voto

Julian Reschke Points 12698

Firefox, MSIE (à partir de la version 9), de l'Opéra, Konq Chrome et de soutien; MSIE8 et Safari pas en charge; d'autres, est inconnue - l'encodage défini dans la RFC 5987.

Notez que dans

  Content-Disposition: attachment; filename*=UTF-8''weird%20%23%20%80%20%3D%20%7B%20%7D%20%3B%20filename.txt

vous avez obtenu le type d'encodage du caractère Euro de mal; c'est point de code unicode n'est pas %80, la fixation de ce devrait le faire fonctionner partout, sauf Safari (le bon codage %e2%82%ac).

Cas de Test à:

http://greenbytes.de/tech/tc2231/#attwithfn2231utf8

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X