web-dev-qa-db-fra.com

Moyen pratique d'analyser les paramètres multipart / form-data entrants dans un servlet

Existe-t-il un moyen pratique de lire et d’analyser les données de la demande entrante?.

Le client E.g lance une demande de publication

URLConnection connection = new URL(url).openConnection();
connection.setDoOutput(true);
connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
PrintWriter writer = null;
try {
    OutputStream output = connection.getOutputStream();
    writer = new PrintWriter(new OutputStreamWriter(output, charset), true); // true = autoFlush, important!
    // Send normal param.
    writer.println("--" + boundary);
    writer.println("Content-Disposition: form-data; name=\"param\"");
    writer.println("Content-Type: text/plain; charset=" + charset);
    writer.println();
    writer.println(param);

Je ne parviens pas à me paramétrer avec request.getParameter("paramName"). Le code suivant

BufferedReader reader = new BufferedReader(new InputStreamReader(
    request.getInputStream()));
  StringBuilder sb = new StringBuilder();
  for (String line; (line = reader.readLine()) != null;) {
   System.out.println(line);

  }

affiche cependant le contenu pour moi

-----------------------------29772313742745
Content-Disposition: form-data; name="name"
J.Doe
-----------------------------29772313742745
Content-Disposition: form-data; name="email"
[email protected]
-----------------------------29772313742745

Quel est le meilleur moyen d'analyser la demande entrante? Je ne veux pas écrire mon propre analyseur, il existe probablement une solution prête à l'emploi.

62
atuser

Les requêtes codées multipart/form-data Ne sont en effet pas prises en charge par défaut par l'API Servlet antérieure à la version 3.0. L'API Servlet analyse les paramètres par défaut en utilisant le codage application/x-www-form-urlencoded. Lorsque vous utilisez un codage différent, les appels request.getParameter() renverront tous null. Lorsque vous êtes déjà sur Servlet 3.0 ( Glassfish , Tomcat 7 , etc.), vous pouvez utiliser HttpServletRequest#getParts() au lieu. Voir aussi ce blog pour des exemples étendus.

Avant Servlet 3.0, une requête de facto standard pour analyser multipart/form-data Utiliserait Apache Commons FileUpload . Lisez attentivement les sections du guide de l’utilisateur et (FAQ) pour apprendre pour l'utiliser. J'ai posté une réponse avec un exemple de code avant ici (il contient également un exemple ciblant Servlet 3.0).

77
BalusC

Solutions:

Solution A:

  1. Télécharger http://www.servlets.com/cos/index.html
  2. Appelez getParameters () sur com.oreilly.servlet.MultipartRequest

Solution B:

  1. Télécharger http://jakarta.Apache.org/commons/fileupload/
  2. Invoquer readHeaders () dans org.Apache.commons.fileupload.MultipartStream

Solution C:

  1. Télécharger http://users.boone.net/wbrameld/multipartformdata/
  2. Appelez getParameter sur com.bigfoot.bugar.servlet.http.MultipartFormData

Solution D:

Utilisez Struts. Struts 1.1 gère cela automatiquement.

Référence: http://www.jguru.com/faq/view.jsp?EID=1045507

16
renura

Il n'y a pas toujours de servlet avant d'un téléchargement (je pourrais utiliser un filtre par exemple). Ou peut-être que le même contrôleur (encore un filtre ou également un servelt) peut servir de nombreuses actions, donc je pense que cela dépend de cette configuration de servlet pour utiliser la méthode getPart (uniquement pour l'API Servlet> = 3.0), je ne sais pas Je n'aime pas.

En général, je préfère les solutions indépendantes, capables de vivre seules, et dans ce cas http://commons.Apache.org/proper/commons-fileupload/ en fait partie.

List<FileItem> multiparts = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
    for (FileItem item : multiparts) {
        if (!item.isFormField()) {
            //your operations on file
        } else {
            String name = item.getFieldName();
            String value = item.getString();
            //you operations on paramters
        }
}
6
Luca Rasconi