Не много завершенных примеров загрузки файлов в JAX-RS, особенно RESTEasy .
Здесь мы покажем вам два полных примера RESTEasy для обработки загрузки файлов из формы HTML.
, Обычный способ обработки загруженного файла через
MultipartFormDataInput
, Сопоставить загруженный файл с классом POJO через
@ MultipartForm
1. RESTEasy Multipart Dependency
В RESTEasy вам нужен « resteasy-multipart-provider.jar » для обработки загрузки нескольких файлов.
File: 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. Файл Загрузить HTML-форму
Простая HTML-форма для загрузки файла.
<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
В первом примере загруженный файл будет автоматически сопоставлен с « 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();
}
}
В этом примере, если вы выберете файл « c: \\ abc.png » с локального диска C, нажмите кнопку «Отправить», и он будет загружен в « d: \\ abc.png ».
Загрузить его - ссылка://wp-content/uploads/2011/07/JAX-RS-FileUpload-Resteasy-Example1.zip[JAX-RS-FileUpload-Resteasy-Example1.zip](8 КБ)
3.2 Пример MultipartForm
Этот пример отобразит загруженный файл в класс POJO, вам нужно обработать
inputPart
, как в примере 3.1
POJO файл, сопоставить загруженный файл с этим классом .
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;
}
}
Решить загруженный файл .
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();
}
}
Проблема в том, что вы не можете получить загруженное имя файла! Чтобы исправить это, вы можете поместить текстовое поле в HTML-форму, чтобы пользователь мог ввести загруженное имя файла и сопоставить его с «
FileUploadForm
» через
@FormParam (" имя файла ")
.
Скачайте его - ссылка://wp-content/uploads/2011/07/JAX-RS-FileUpload-Resteasy-Example2.zip[JAX-RS-FileUpload-Resteasy-Example2.zip](8 КБ)
Вывод
В целом, RESTEasy может хорошо обрабатывать несколько частей, но довольно сложно получить информацию о заголовке загруженного файла, например, имя файла. Или, может быть, я не знаю, как использовать RESTEasy API?
Рекомендации
, http://stackoverflow.com/questions/2637017/how-do-i-do-a-multipart-form-file-upload-with-jax-rs [How
сделать загрузку файла multipart/form с помощью jax-rs?], http://stackoverflow.com/questions/4875780/resteasy-multipart-data-form-file-upload-on-gae [Resteasy
загрузка файла multipart/data-form в GAE]
ссылка://тег/загрузка файла/[загрузка файла]ссылка://тег/jax-rs/[jax-rs]ссылка://тег/Resteasy/[Resteasy]