2010-07-26 5 views
54

Existe-t-il un moyen pratique de lire et d'analyser les données d'une requête entrante?Manière pratique d'analyser les paramètres entrants multipart/form-data dans une servlet

client demande Initié par exemple après

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 suis pas en mesure d'obtenir à l'aide request.getParameter("paramName") param. 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 

Quelle est la meilleure façon d'analyser la demande entrante? Je ne veux pas écrire mon propre analyseur, il y a probablement une solution prête. Les demandes codées ne sont en effet pas supportées par défaut par l'API Servlet avant la version 3.0.

Répondre

71

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, vous pouvez utiliser HttpServletRequest#getParts() à la place. Voir aussi this blog pour des exemples étendus.

Avant Servlet 3.0, une norme de facto pour analyser multipart/form-data requêtes utiliserait Apache Commons FileUpload. Il suffit de lire attentivement ses sections et pour savoir comment l'utiliser. J'ai posté une réponse avec un exemple de code avant here (il contient également un exemple ciblant Servlet 3.0).

+1

Soyez prudent. Une partie de la documentation sur le site Apache est erronée. Par exemple, ils disent que vous pouvez appeler setRepository() sur un objet FileItemFactory qui est false, car tout objet qui implémente FileItemFactory a une seule méthode: createItem(). Assurez-vous donc de lire également les javadocs. – Cheruvim

+1

'getParts()' retourne toujours zéro élément. Pourquoi est-il si difficile de récupérer des formulaires en plusieurs parties dans Java et Servlet 3.0? Je ne peux pas le croire! – basZero

+0

@basZero: la réponse à la question en double explique déjà quand il serait vide. – BalusC

16

Solutions:

Solution A:

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

Solution B:

  1. vers le bas charge http://jakarta.Apache.org/commons/fileupload/
  2. Invoke readHeaders() dans org.apache.commons.fileupload.MultipartStream

Solution C:

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

Solution D:

Utilisez des entretoises. Struts 1.1 gère cela automatiquement.

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

+4

S'il vous plaît mettre en place des solutions que ces liens peuvent obtenir absolue à tout moment à l'avenir. Cela attirera une note négative. –

2

Pas toujours il y a une servlet avant d'un téléchargement (je pourrais utiliser un filtre par exemple). Ou pourrait être que le même contrôleur (encore un filtre ou un servelt) peut servir de nombreuses actions, donc je pense que s'appuyer sur cette configuration servlet pour utiliser la méthode getPart (seulement pour Servlet API> = 3.0), je ne sais pas sais, je n'aime pas.

En général, je préfère des solutions indépendantes, capables de vivre seul, 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 
     } 
} 
Questions connexes