web-dev-qa-db-fra.com

Nom d'encodage UTF-8 dans le fichier téléchargé

J'essaie de laisser l'utilisateur télécharger le fichier Excel avec le nom japonais. Il semble que cela fonctionne IE 8 uniquement et d’autres IE et Firefox, cela ne fonctionne pas. Suggérez-moi comment éviter cela.

String fileName = dateString+"_マイページ情報.xls";
byte[] data = writer.getData();
response.setContentType("application/ms-Excel");
response.setContentLength(data.length);
response.setHeader("Expires:", "0"); // eliminates browser caching
response.setHeader("Content-Disposition","attachment; filename="+URLEncoder.encode(fileName));
22
zawhtut

Je l'ai résolu comme suit.

fileName = dateString+"_マイページ情報.xls"; 
fileName = URLEncoder.encode(fileName,"UTF-8"); 
try {
        response.setContentType("application/ms-Excel; charset=UTF-8");
        response.setCharacterEncoding("UTF-8");
        if(browserType.equals("IE")||browserType.equals("Chrome"))
            response.setHeader("Content-Disposition","attachment; filename="+fileName);
        if(browserType.endsWith("Firefox"))
            response.setHeader("Content-Disposition","attachment; filename*=UTF-8''"+fileName);
    } catch (Exception e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
35
zawhtut

Utilisez la méthode setCharacterEncoding :

Définit le codage de caractères (jeu de caractères MIME) de la réponse envoyée au client, par exemple, à UTF-8. Si le codage de caractères a déjà été défini par setContentType (Java.lang.String) ou setLocale (Java.util.Locale), cette méthode la remplace. Appel setContentType (Java.lang.String) avec la chaîne de caractères text/html et appeler cette méthode avec la chaîne de UTF-8 équivaut à appelant setContentType avec la chaîne de caractères text/html; jeu de caractères = UTF-8.

Cette méthode peut être appelée à plusieurs reprises pour changer le codage de caractères . Cette méthode n'a aucun effet si elle est appelée après que getWriter a été appelé ou après que la réponse a été validée.

Modifiez votre code avec les éléments suivants:

response.setContentType("application/ms-Excel; charset=UTF-8");
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Disposition","attachment; filename="+URLEncoder.encode(fileName, "UTF-8"));
9
Ankur Lathi

Dans l'appel URLEncoder, transmettez le deuxième argument facultatif "UTF-8" . Voir http://docs.Oracle.com/javase/1.4.2/docs/api/Java/net/URLEncoder.html# encode (Java.lang.String,% 20Java.lang.String)

5
Tom

Voici ce que j'ai fait et cela fonctionne sur TOUS LES NAVIGATEURS que j'ai essayés (Chrome, Firefox et Safari). De plus, je n'ai pas eu à écrire de code spécifique au navigateur.

Selon ce lien: http://blogs.msdn.com/b/ieinternals/archive/2010/06/07/content-disposition-attachment-and-international-unicode-characters.aspx

tous les navigateurs tenteront de dériver le nom du fichier à partir du chemin composant de l'URL

Ainsi, si le navigateur demande une URL avec le nom du fichier à la fin, il nommera le fichier correctement. Cela semble être vrai pour tous les navigateurs.

Dans mon cas personnel, le client ne sait pas le nom du fichier qu'il veut télécharger. Notre système effectue un GET pour un fichier basé sur un ID. Par exemple:

/api/file/download/<file_id>

Donc, ce que j'ai fait est de demander à cette API de rechercher le nom de fichier (nous la stockons dans la base de données, par id_fichier), de la coder par URL et de redirect vers une deuxième API qui inclut le nom de fichier. Par exemple:

/api/file/download/<file_id>/<url-encoded filename>

Ensuite, la 2e API utilisera le paramètre file_id pour rechercher et retransmettre le contenu du fichier, et le navigateur utilisera la partie nom de fichier pour nommer le fichier téléchargé. 

REMARQUE: La 2e API ignore le nom de fichier (n'en a pas besoin). Il définit également l'en-tête Content-Disposition sur "attachment"; only (NE PAS définir le nom de fichier. Laissez le navigateur l'obtenir à partir de l'URL.)

2
yngwietiger

ci-dessous fonctionne bien.

String fileName = URLEncoder.encode(fileName, "UTF-8");
response.setHeader("Content-Disposition","attachment; filename="+fileName );
0
mingming chen