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.