Configuration d'une ressource pour la réception de composants de données de formulaire/multiple à partir d'une soumission de formulaire HTML dans JAX-RS 2.0
Les formulaires HTML qui transmettent des données de fichier doivent être configurés avec la méthode POST et l'action "données de formulaire/multiple". Ces données peuvent être reçues d'une ou deux façons différentes par la méthodes de ressource JAX-RS qui l'accepte avec l'implémentation IBM JAX-RS (Java™ API for RESTful Web Services).
Pourquoi et quand exécuter cette tâche
Cette tâche fournit des instructions pour la configuration
d'une méthode JAX-RS à utiliser pour produire des données de formulaire/multiple. L'exemple suivant illustre un formulaire HTML :
<form action="http://www.example.com/" method="POST" enctype="multipart/form-data">
<input type="text" name="fileid" />
<br />
<input type="text" name="description" />
<br />
<input type="file" name="thefile" />
<br />
<input type="submit" name="submit" value="submit"/>
</form>
Vous pouvez implémenter la méthode IBM JAX-RS pour recevoir les données
en plusieurs parties, afin de pouvoir traiter vous-même ces composants si nécessaire.Procédure
Créez une méthode de ressource. Vous devez déclarer l'une des méthodes de ressource suivantes pour recevoir et renvoyer
des données de formulaire/multiple depuis une méthode POST HTTP :
package com.example.jaxrs;
@POST
@Consumes("multipart/form-data")
@Produces("multipart/form-data")
public Response postFormData(IMultipartBody multipartBody) {
List <IAttachment> attachments = multipartBody.getAllAttachments();
String formElementValue = null;
InputStream stream = null;
for (Iterator<IAttachment> it = attachments.iterator(); it.hasNext();) {
IAttachment attachment = it.next();
if (attachment == null) {
continue;
}
DataHandler dataHandler = attachment.getDataHandler();
stream = dataHandler.getInputStream();
MultivaluedMap<String, String> map = attachment.getHeaders();
String fileName = null;
String formElementName = null;
String[] contentDisposition = map.getFirst("Content-Disposition").split(";");
for (String tempName : contentDisposition) {
String[] names = tempName.split("=");
formElementName = names[1].trim().replaceAll("\"", "");
if ((tempName.trim().startsWith("filename"))) {
fileName = formElementName;
}
}
if (fileName == null) {
StringBuffer sb = new StringBuffer();
BufferedReader br = new BufferedReader(new InputStreamReader(stream));
String line = null;
try {
while ((line = br.readLine()) != null) {
sb.append(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
formElementValue = sb.toString();
System.out.println(formElementName + ":" + formElementValue);
} else {
//handle the file as you want
File tempFile = new File(fileName);
...
}
}
if (stream != null) {
stream.close();
}
return Response.ok("test").build();
}
ou
package com.example.jaxrs;
@POST
@Consumes("multipart/form-data")
@Produces("multipart/form-data")
public Response postFormData(List<IAttachment>attachments) {
List <IAttachment> attachments = multipartBody.getAllAttachments();
String formElementValue = null;
InputStream stream = null;
for (Iterator<IAttachment> it = attachments.iterator(); it.hasNext();) {
IAttachment attachment = it.next();
if (attachment == null) {
continue;
}
DataHandler dataHandler = attachment.getDataHandler();
stream = dataHandler.getInputStream();
MultivaluedMap<String, String> map = attachment.getHeaders();
String fileName = null;
String formElementName = null;
String[] contentDisposition = map.getFirst("Content-Disposition").split(";");
for (String tempName : contentDisposition) {
String[] names = tempName.split("=");
formElementName = names[1].trim().replaceAll("\"", "");
if ((tempName.trim().startsWith("filename"))) {
fileName = formElementName;
}
}
if (fileName == null) {
StringBuffer sb = new StringBuffer();
BufferedReader br = new BufferedReader(new InputStreamReader(stream));
String line = null;
try {
while ((line = br.readLine()) != null) {
sb.append(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
formElementValue = sb.toString();
System.out.println(formElementName + ":" + formElementValue);
} else {
//handle the file as you want
File tempFile = new File(fileName);
...
}
}
if (stream != null) {
stream.close();
}
return Response.ok("test").build();
}
L'émetteur de la soumission POST du formulaire peut générer un en-tête
Content-Transfer-Encoding pour une ou plusieurs parties du message composite. L'implémentation
IBM JAX-RS tente de décoder automatiquement la charge du composant en fonction de cet en-tête
lorsque ce dernier est de type de codage base64 ou quoted-printable.Résultats
Vous avez reçu et renvoyé des données depuis un type de contenu HTTP POST avec données de formulaire/multiple, en autorisant l'implémentation à scinder et décoder automatiquement les composants pour vous, et en recevant les parties toujours codées à traiter par vous-même.