68 votes

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?

Par exemple, le client initie une demande de poste

 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 à utiliser param 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);

  }
 

cependant affiche le contenu pour moi

 -----------------------------29772313742745
Content-Disposition: form-data; name="name"
J.Doe
-----------------------------29772313742745
Content-Disposition: form-data; name="email"
abuse@spamcop.com
-----------------------------29772313742745
 

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

83voto

BalusC Points 498232

multipart/form-data demandes codées sont en effet pas par défaut pris en charge par la Servlet API antérieures à la version 3.0. La Servlet API analyse les paramètres par défaut à l'aide de application/x-www-form-urlencoded d'encodage. Lors de l'utilisation d'un codage différent, l' request.getParameter() appels seront tous de retour null. Lorsque vous êtes déjà en Servlet 3.0 (Glassfish 3, Tomcat 7, etc...), vous pouvez utiliser HttpServletRequest#getParts() à la place. Voir aussi ce blog pour des exemples.

Avant de Servlet 3.0, une de facto standard pour analyser multipart/form-data demandes à l'aide d'Apache Commons FileUpload. Juste à lire attentivement son Guide de l'Utilisateur et Questions Fréquemment Posées sections pour apprendre comment l'utiliser. J'ai posté une réponse avec un exemple de code avant ici (il contient également un exemple de ciblage Servlet 3.0).

16voto

renura Points 91

Solutions:

Solution A:

  1. Télécharger http://www.servlets.com/cos/index.html
  2. Invoquer 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. Invoquer getParameter sur com.bigfoot.bugar.servlet.http.MultipartFormData

Solution D:

L'Utilisation De Struts. Struts 1.1 gère cela automatiquement.

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

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