Pas beaucoup d’exemples complets de téléchargement de fichiers dans JAX-RS, en particulier RESTEasy .
Ici, nous vous montrons deux exemples complets de RESTEasy pour gérer le téléchargement de fichiers à partir d’un formulaire HTML.
-
Manière normale de gérer le fichier téléchargé via
MultipartFormDataInput
-
Mappez le fichier téléchargé vers une classe POJO via
@ MultipartForm
1. Dépendance RESTEasy Multipart
Dans RESTEasy, vous avez besoin de « resteasy-multipart-provider.jar » pour gérer le téléchargement de fichiers en plusieurs parties.
Fichier: pom.xml
<dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-jaxrs</artifactId> <version>2.2.1.GA</version> </dependency> <dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-multipart-provider</artifactId> <version>2.2.0.GA</version> </dependency> <!-- optional, good for handle I/O task --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.0.1</version> </dependency>
2. Formulaire HTML de téléchargement de fichier
Formulaire HTML simple pour télécharger le fichier.
<html> <body> <h1>JAX-RS Upload Form</h1> <form action="rest/file/upload" method="post" enctype="multipart/form-data"> <p> Select a file : <input type="file" name="uploadedFile" size="50"/> </p> <input type="submit" value="Upload It"/> </form> </body> </html>
3.1 Exemple MultipartFormDataInput
Premier exemple, le fichier téléchargé mappera automatiquement sur « MultipartFormDataInput ».
import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.List; import java.util.Map; import javax.ws.rs.Consumes; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.core.Response; import org.apache.commons.io.IOUtils; import org.jboss.resteasy.plugins.providers.multipart.InputPart; import org.jboss.resteasy.plugins.providers.multipart.MultipartFormDataInput; @Path("/file") public class UploadFileService { private final String UPLOADED__FILE__PATH = "d:\\"; @POST @Path("/upload") @Consumes("multipart/form-data") public Response uploadFile(MultipartFormDataInput input) { String fileName = ""; Map<String, List<InputPart>> uploadForm = input.getFormDataMap(); List<InputPart> inputParts = uploadForm.get("uploadedFile"); for (InputPart inputPart : inputParts) { try { MultivaluedMap<String, String> header = inputPart.getHeaders(); fileName = getFileName(header); //convert the uploaded file to inputstream InputStream inputStream = inputPart.getBody(InputStream.class,null); byte[]bytes = IOUtils.toByteArray(inputStream); //constructs upload file path fileName = UPLOADED__FILE__PATH + fileName; writeFile(bytes,fileName); System.out.println("Done"); } catch (IOException e) { e.printStackTrace(); } } return Response.status(200) .entity("uploadFile is called, Uploaded file name : " + fileName).build(); } /** ** ** header sample ** { ** Content-Type=[image/png], ** Content-Disposition=[form-data; name="file"; filename="filename.extension"] ** } ** ** / //get uploaded filename, is there a easy way in RESTEasy? private String getFileName(MultivaluedMap<String, String> header) { String[]contentDisposition = header.getFirst("Content-Disposition").split(";"); for (String filename : contentDisposition) { if ((filename.trim().startsWith("filename"))) { String[]name = filename.split("="); String finalFileName = name[1].trim().replaceAll("\"", ""); return finalFileName; } } return "unknown"; } //save to somewhere private void writeFile(byte[]content, String filename) throws IOException { File file = new File(filename); if (!file.exists()) { file.createNewFile(); } FileOutputStream fop = new FileOutputStream(file); fop.write(content); fop.flush(); fop.close(); } }
Dans cet exemple, si vous sélectionnez un fichier “ c: \\ abc.png ” à partir de votre lecteur C local, cliquez sur le bouton d’envoi, il sera alors chargé sur “ d: \\ abc.png “.
Téléchargez-le - lien://wp-content/uploads/2011/07/JAX-RS-FileUpload-Resteasy-Example1.zip[JAX-RS-FileUpload-Resteasy-Example1.zip](8 Ko)
3.2 Exemple MultipartForm
Cet exemple mappera le fichier téléchargé sur une classe POJO, vous devez donc gérer l’exemple
inputPart
comme 3.1.
Fichier POJO, mappez le fichier téléchargé vers cette classe.
import javax.ws.rs.FormParam; import org.jboss.resteasy.annotations.providers.multipart.PartType; public class FileUploadForm { public FileUploadForm() { } private byte[]data; public byte[]getData() { return data; } @FormParam("uploadedFile") @PartType("application/octet-stream") public void setData(byte[]data) { this.data = data; } }
Handle le fichier téléchargé.
import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import javax.ws.rs.Consumes; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.core.Response; import org.jboss.resteasy.annotations.providers.multipart.MultipartForm; @Path("/file") public class UploadFileService { @POST @Path("/upload") @Consumes("multipart/form-data") public Response uploadFile(@MultipartForm FileUploadForm form) { String fileName = "d:\\anything"; try { writeFile(form.getData(), fileName); } catch (IOException e) { e.printStackTrace(); } System.out.println("Done"); return Response.status(200) .entity("uploadFile is called, Uploaded file name : " + fileName).build(); } //save to somewhere private void writeFile(byte[]content, String filename) throws IOException { File file = new File(filename); if (!file.exists()) { file.createNewFile(); } FileOutputStream fop = new FileOutputStream(file); fop.write(content); fop.flush(); fop.close(); } }
Le problème est que vous ne pouvez pas obtenir le nom du fichier téléchargé! Pour résoudre ce problème, vous pouvez placer une zone de texte au format HTML afin que l’utilisateur puisse saisir le nom du fichier téléchargé et le mapper sur « FileUploadForm » via «@FormParam (" nom__fichier ")`.
Téléchargez-le - lien://wp-content/uploads/2011/07/JAX-RS-FileUpload-Resteasy-Example2.zip[JAX-RS-FileUpload-Resteasy-Example2.zip](8 Ko)
Conclusion
En règle générale, RESTEasy est capable de gérer plusieurs parties bien, mais il est plutôt difficile d’obtenir les informations d’en-tête du fichier téléchargé, comme le nom de fichier. Ou peut-être que je ne sais pas comment utiliser l’API RESTEasy?
Références
puis-je télécharger un fichier multipart/form avec jax-rs?]. http://stackoverflow.com/questions/4875780/resteasy-multipart-data-form-file-upload-on
chargement de fichier multipart/data-form sur GAE]
lien://tag/fichier-upload/[fichier upload]lien://tag/jax-rs/[jax-rs]lien://tag/resteasy/[resteasy]