Beispielhaftes Beispiel für das vollständige Hochladen von Dateien in JAX-RS, insbesondere RESTEasy
Hier zeigen wir Ihnen zwei vollständige RESTEasy-Beispiele für das Hochladen von Dateien aus einem HTML-Formular.
-
Normalerweise können hochgeladene Dateien über
MultipartFormDataInput
verarbeitet werden -
Hochgeladene Datei über @ MultipartForm in eine POJO-Klasse aufnehmen
1. RESTEasy Multipart Abhängigkeit
In RESTEasy benötigen Sie " resteasy-multipart-provider.jar ", um das Hochladen von mehrteiligen Dateien durchzuführen.
Datei: 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. Datei-Upload-HTML-Formular
Einfaches HTML-Formular zum Hochladen der Datei.
<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 MultipartFormDataInput-Beispiel
Im ersten Beispiel wird die hochgeladene Datei automatisch " MultipartFormDataInput " zugeordnet.
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(); } }
Wenn Sie in diesem Beispiel eine Datei " c: \\ abc.png " von Ihrem lokalen Laufwerk C auswählen, klicken Sie auf die Schaltfläche "Abschicken". Dann wird sie in " d: \\ abc.png " hochgeladen.
Download - JAX-RS-FileUpload-Resteasy-Example1.zip (8 KB)
3.2 MultipartForm-Beispiel
In diesem Beispiel wird die hochgeladene Datei einer POJO-Klasse zugeordnet. Sie müssen also das
inputPart
wie in 3.1 behandeln.
POJO-Datei, zugeordnete Datei dieser Klasse zuordnen.
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 die hochgeladene Datei.
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(); } }
Das Problem ist, dass Sie den hochgeladenen Dateinamen nicht erhalten können! Um dies zu beheben, können Sie ein Textfeld in ein HTML-Formular einfügen, sodass der Benutzer den hochgeladenen Dateinamen eingeben und über @FormParam ("Dateiname") `" FileUploadForm "zuordnen kann.
Download it - JAX-RS-FileUpload-Resteasy-Example2.zip (8 KB)
Schlussfolgerung
Insgesamt ist RESTEasy in der Lage, mit Multipart gut umzugehen, es ist jedoch ziemlich schwierig, die hochgeladenen Dateiheaderinformationen wie Dateiname zu erhalten. Oder weiß ich vielleicht nicht, wie ich die RESTEasy-API verwenden soll?
Referenzen
führe ich eine Multipart-/Formulardatei mit jax-rs aus?]. http://stackoverflow.com/questions/4875780/resteasy-multipart-data-form-file-upload-on-gae
Hochladen von Dateien mit mehreren Formaten/Datenformaten auf GAE
Link://Tag/Datei-Upload/[Dateiupload]Link://Tag/Jax-rs/[Jax-Rs] resteasy