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.
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).
Solutions:
Solution A:
com.oreilly.servlet.MultipartRequest
Solution B:
org.Apache.commons.fileupload.MultipartStream
Solution C:
Solution D:
Utilisez Struts. Struts 1.1 gère cela automatiquement.
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
}
}