web-dev-qa-db-fra.com

Le texte UTF-8 est tronqué lorsque le formulaire est publié en tant que données en plusieurs parties / formulaire

Je télécharge un fichier sur le serveur. Le formulaire HTML de téléchargement de fichier comporte 2 champs:

  1. Nom de fichier - Une zone de texte HTML où l'utilisateur peut donner un nom dans n'importe quelle langue.
  2. Téléchargement de fichier - Un "fichier" HTMl où l'utilisateur peut spécifier un fichier du disque à télécharger.

Lorsque le formulaire est soumis, le contenu du fichier est reçu correctement. Cependant, lorsque le nom de fichier (point 1 ci-dessus) est lu, il est tronqué. ASCII s'affichent correctement. Lorsque le nom est donné dans une autre langue (allemand, français, etc.), il y a des problèmes.

Dans la méthode servlet, le codage de caractères de la demande est défini sur UTF-8. J'ai même essayé de faire un filtre comme mentionné - Comment puis-je faire en sorte que ce code soumette une zone de texte de formulaire UTF-8 avec le travail jQuery/Ajax? - mais cela ne semble pas travailler. Seul le nom de fichier semble être tronqué.

La table MySQL où va le nom du fichier prend en charge UTF-8. J'ai donné des caractères non anglais aléatoires et ils sont stockés/affichés correctement.

En utilisant Fiddler, j'ai surveillé la demande et toutes les données POST sont passées correctement. J'essaie d'identifier comment/où les données pourraient être altérées. Toute aide sera grandement appréciée.

50
Aswin Anand

J'ai eu le même problème avec Apache commons-fileupload. Je n'ai pas découvert ce qui cause les problèmes, en particulier parce que j'ai l'encodage UTF-8 dans les endroits suivants: 1. Balise Meta HTML 2. Attribut Form Accept-Charset 3. Filtre Tomcat à chaque demande qui définit le "UTF-8" codage

-> Ma solution a été de convertir en particulier les chaînes de ISO-8859-1 (ou quel que soit l'encodage par défaut de votre plateforme) en UTF-8:

new String (s.getBytes ("iso-8859-1"), "UTF-8");

j'espère que ça t'as aidé

Edit: en commençant par Java 8, vous pouvez également utiliser ce qui suit:

new String (s.getBytes (StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
55
Philip Helger

Utilisez simplement la bibliothèque de téléchargement Apache commons. Ajouter URIEncoding="UTF-8" au connecteur de Tomcat et utilisez FileItem.getString ("UTF-8") au lieu de FileItem.getString () sans jeu de caractères spécifié.

J'espère que cette aide.

26
nautilusvn

Je suis resté coincé avec ce problème et j'ai trouvé que c'était l'ordre de l'appel à

request.setCharacterEncoding("UTF-8");

qui causait le problème. Il doit être appelé avant tout appel à request.getParameter (), j'ai donc créé un filtre spécial à utiliser en haut de ma chaîne de filtres.

http://www.ninthavenue.com.au/servletrequest-setcharactercoding-ignored

18
Roger Keays

J'ai eu le même problème et il s'est avéré qu'en plus de spécifier l'encodage dans le filtre

request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");

il est nécessaire d'ajouter "acceptcharset" au formulaire

<form method="post" enctype="multipart/form-data" acceptcharset="UTF-8" > 

et exécutez la JVM avec

-Dfile.encoding=UTF-8

La balise Meta HTML n'est pas nécessaire si vous l'envoyez dans l'en-tête HTTP à l'aide de response.setCharacterEncoding ().

11
Dan

Au cas où quelqu'un serait tombé sur ce problème en travaillant sur l'application Web Grails (ou Pure Spring), voici l'article qui m'a aidé:

http://forum.spring.io/forum/spring-projects/web/2491-solved-character-encoding-and-multipart-forms

Pour définir le codage par défaut sur UTF-8 (au lieu de l'ISO-8859-1) pour les demandes en plusieurs parties, j'ai ajouté le code suivant dans resources.groovy (Spring DSL):

multipartResolver(ContentLengthAwareCommonsMultipartResolver) {
    defaultEncoding = 'UTF-8'
}
7
Rognvald Eaversen

J'utilise org.Apache.commons.fileupload.servlet.ServletFileUpload.ServletFileUpload(FileItemFactory) et je définis l'encodage lors de la lecture de la valeur du paramètre:

List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);

for (FileItem item : items) {
    String fieldName = item.getFieldName();

    if (item.isFormField()) {
        String fieldValue = item.getString("UTF-8"); // <-- HERE
3
György Novák

Le filtre est essentiel pour IE. Quelques autres choses à vérifier;

Quels sont l'encodage de page et le jeu de caractères? Les deux devraient être UTF-8

<%@ page language="Java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

Quel est le jeu de caractères dans la balise META?

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

Votre chaîne de connexion MySQL spécifie-t-elle UTF-8? par exemple.

jdbc:mysql://127.0.0.1/dbname?requireSSL=false&useUnicode=true&characterEncoding=UTF-8
2
Michael Glenn

J'utilise Primefaces avec glassfish et SQL Server.

dans mon cas, j'ai créé le Webfilter, en back-end, pour obtenir chaque demande et convertir en UTF-8, comme ceci:

package br.com.teste.filter;

import Java.io.IOException;

import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

@WebFilter(servletNames={"Faces Servlet"})
public class Filter implements javax.servlet.Filter {

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        request.setCharacterEncoding("UTF-8");
        chain.doFilter(request, response);      
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // TODO Auto-generated method stub      
    }

}

Dans la vue (.xhtml), je dois définir la forme du paramètre enctype sur UTF-8 comme @Kevin Rahe:

    <h:form id="frmt" enctype="multipart/form-data;charset=UTF-8" >
         <!-- your code here -->
    </h:form>  
1
Weles

Pour éviter de convertir tous les paramètres de demande manuellement en UTF-8, vous pouvez définir une méthode annotée de @InitBinder dans votre contrôleur:

@InitBinder
protected void initBinder(WebDataBinder binder) {
    binder.registerCustomEditor(String.class, new CharacterEditor(true) {
        @Override
        public void setAsText(String text) throws IllegalArgumentException {
            String properText = new String(text.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
            setValue(properText);
        }
    });
}

Ce qui précède convertira automatiquement tous les paramètres de demande en UTF-8 dans le contrôleur où il est défini.

0
Vlad

Vous devez également vous assurer que votre filtre de codage (org.springframework.web.filter.CharacterEncodingFilter) dans votre web.xml est mappé avant le filtre en plusieurs parties (org.springframework.web.multipart.support.MultipartFilter).

0
Romain VDK

Le filtrage et la configuration de Tomcat pour prendre en charge les URI UTF-8 ne sont importants que si vous passez via la chaîne de requête de l'URL, comme vous le feriez avec un HTTP GET. Si vous utilisez un POST, avec une chaîne de requête dans le corps du message HTTP, ce qui est important sera le type de contenu de la demande et ce sera au navigateur de définir le type de contenu sur UTF-8 et envoyer le contenu avec cet encodage.

La seule façon de le faire est de dire au navigateur que vous ne pouvez accepter UTF-8 qu'en définissant l'en-tête Accept-Charset sur chaque réponse à "UTF-8; q = 1, ISO-8859-1; q = 0,6" . Cela mettra UTF-8 comme meilleure qualité et le jeu de caractères par défaut, ISO-8859-1, comme acceptable, mais de qualité inférieure.

Lorsque vous dites que le nom de fichier est tronqué, est-il tronqué dans la valeur de retour de HttpServletRequest.getParameter?

0
nbeyer

Je pense que je suis en retard pour la fête, mais lorsque vous utilisez un wildfly, vous pouvez ajouter un encodage par défaut au standalone.xml. Recherchez simplement dans standalone.xml

<servlet-container name="default"> 

et ajoutez un encodage comme celui-ci:

<servlet-container name="default" default-encoding="UTF-8">
0
Patrick P

J'ai eu le même problème. La seule solution qui a fonctionné pour moi a été d'ajouter <property = "defaultEncoding" value = "UTF-8"> à multipartResoler dans le fichier de configurations de printemps.

0
aManjate