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" (multipart/form-data). Ces données
peuvent être reçues de deux façons par la méthode de ressource JAX-RS qui les accepte avec l'implémentation
IBM Java™ API for RESTful Web Services (JAX-RS).
Pourquoi et quand exécuter cette tâche
Cette tâche fournit des instructions pour configurer une méthode JAX-RS
afin de consommer et 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 la méthode de ressource suivante 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(@FormParam("fileid") int theFileid,
@FormParam("description") String theDescription,
@FormParam("thefile") File theFile) {
// echo what we got in the form
BufferedOutMultiPart bomp = new BufferedOutMultiPart();
OutPart op = new OutPart();
op.setBody(theFile);
op.setContentType(MediaType.TEXT_PLAIN); // or other appropriate type, based on the file you received
bomp.setLocationHeader("thefile");
bomp.addPart(op);
op = new OutPart();
op.setBody(theDescription);
op.setContentType(MediaType.TEXT_PLAIN);
bomp.setLocationHeader("description");
bomp.addPart(op);
BufferedOutMultiPart bomp = new BufferedOutMultiPart();
OutPart op = new OutPart();
op.setBody(theFileid + ""); // just in case theFileid is uninitialized
op.setContentType(MediaType.TEXT_PLAIN);
bomp.setLocationHeader("fileid");
bomp.addPart(op);
return Response.ok(bomp, "multipart/form-data").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 utile de la partie de données en fonction de cet en-tête
lorsque le type de codage de ce dernier est base64 ou quoted-printable.
- Facultatif : Pour JAX-RS 1.1, si vous ne souhaitez pas que l'implémentation IBM JAX-RS
décode automatiquement la charge utile des données, indiquez l'annotation
@Encoded dans le paramètre de la méthode. L'exemple suivant illustre l'utilisation de l'annotation
@Encoded dans le paramètre de la méthode :
package com.example.jaxrs;
@POST
@Consumes("multipart/form-data")
@Produces("multipart/form-data")
public Response postFormData(@FormParam("fileid") int theFileid,
@FormParam("description") String theDescription,
@Encoded @FormParam("thefile") File theFile) {
// don't auto-decode the file part payload
...
}
Si vous souhaitez contrôler complètement l'extraction et le décodage de toutes les parties d'un message
de données de formulaire/multiple, vous pouvez recevoir l'objet BufferedInMultiPart lui-même :package com.example.jaxrs;
import org.apache.wink.common.model.multipart.BufferedInMultiPart;
import org.apache.wink.common.model.multipart.InPart;
@POST
@Consumes("multipart/form-data")
@Produces("multipart/form-data")
public Response postFormData(BufferedInMultiPart bimp) {
List<InPart> parts = bimp.getParts();
// iterate over the "parts" and process them however you like
}
Résultats
Vous allez recevoir et répercuter des données à partir d'une demande HTTP POST
avec l'en-tête Content-Type de données de formulaire/multiple, en permettant à l'implémentation IBM JAX-RS
de diviser et de décoder automatiquement les parties pour vous, et en recevant les parties encore codées
à traiter vous-même.