今天学习的是jax-rs中的上传文件.
1 首先要包含的是resteasy-multipart-provider.jar这个文件
2) 之后是简单的HTML FORM
<html>
<body>
<h1>JAX-RS Upload Form</h1>
<form action="rest/file/upload" method="post" enctype="multipart/form-data">
Select a file : <input type="file" name="uploadedFile" size="50" />
<input type="submit" value="Upload It" />
</form>
</body>
</html>
3 代码如下,先列出,再讲解:
Java代码
1. import
2. import
3. import
4. import
5. import
6. import
7. import
8. import
9. import
10. import
11. import
12. import
13. import
14. import
15.
16. @Path("/file")
17. public class
18.
19. private final String UPLOADED_FILE_PATH = "d:\\";
20.
21. @POST
22. @Path("/upload")
23. @Consumes("multipart/form-data")
24. public
25.
26. "";
27.
28. Map<String, List<InputPart>> uploadForm = input.getFormDataMap();
29. "uploadedFile");
30.
31. for
32.
33. try
34.
35. MultivaluedMap<String, String> header = inputPart.getHeaders();
36. fileName = getFileName(header);
37.
38. //convert the uploaded file to inputstream
39. class,null);
40.
41. byte
42.
43. //constructs upload file path
44. fileName = UPLOADED_FILE_PATH + fileName;
45.
46. writeFile(bytes,fileName);
47.
48. "Done");
49.
50. catch
51. e.printStackTrace();
52. }
53.
54. }
55.
56. return Response.status(200)
57. "uploadFile is called, Uploaded file name : "
58.
59. }
60.
61. /**
62. * header sample
63. * {
64. * Content-Type=[image/png],
65. * Content-Disposition=[form-data; name="file"; filename="filename.extension"]
66. * }
67. **/
68. //get uploaded filename, is there a easy way in RESTEasy?
69. private
70.
71. "Content-Disposition").split(";");
72.
73. for
74. if ((filename.trim().startsWith("filename"))) {
75.
76. "=");
77.
78. 1].trim().replaceAll("\"", "");
79. return
80. }
81. }
82. return "unknown";
83. }
84.
85. //save to somewhere
86. private void writeFile(byte[] content, String filename) throws
87.
88. new
89.
90. if
91. file.createNewFile();
92. }
93.
94. new
95.
96. fop.write(content);
97. fop.flush();
98. fop.close();
99.
100. }
101. }
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();
}
}
这里,用户选择了文件上传后,会URL根据REST的特性,自动map
到uploadFile方法中,然后通过:
Map<String, List<InputPart>> uploadForm = input.getFormDataMap();
List<InputPart> inputParts = uploadForm.get("uploadedFile");
找出所有的上传文件框(可以是多个),然后进行循环工作:
首先是获得每个文件头的HEADER,用这个
MultivaluedMap<String, String> header = inputPart.getHeaders();
然后在header中取出文件名,这里使用的方法是getFileName,另外写了个方法:
Java代码
1. private
2.
3. "Content-Disposition").split(";");
4.
5. for
6. if ((filename.trim().startsWith("filename"))) {
7.
8. "=");
9.
10. 1].trim().replaceAll("\"", "");
11. return
12. }
13. }
14. return "unknown";
15. }
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";
}
这里,比较麻烦,要获得header,比如header是如下形式的,然后要再提取其中的文件名:
Content-Disposition=[form-data; name="file"; filename="filename.extension"]
最后用writeFile写入磁盘.真麻烦呀,还是用spring mvc好.
2
MultipartForm 的例子, MultipartForm 中,将上传的文件中的属性配置到
POJO中,例子为:FileUploadForm 类,这个POJO类对应上传的文件类.
Java代码
1. import
2. import
3.
4. public class
5.
6. public
7. }
8.
9. private byte[] data;
10.
11. public byte[] getData() {
12. return
13. }
14.
15. @FormParam("uploadedFile")
16. @PartType("application/octet-stream")
17. public void setData(byte[] data) {
18. this.data = data;
19. }
20.
21. }
22.
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;
}
}
处理部分就简单多了,可以这样:
Java代码
1. Path("/file")
2. public class
3.
4. @POST
5. @Path("/upload")
6. @Consumes("multipart/form-data")
7. public Response uploadFile(@MultipartForm
8.
9. "d:\\anything";
10.
11. try
12. writeFile(form.getData(), fileName);
13. catch
14.
15. e.printStackTrace();
16. }
17.
18. "Done");
19.
20. return Response.status(200)
21. "uploadFile is called, Uploaded file name : "
22.
23. }
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();
}
即可.
但总的感觉,REST有点蛋疼,上传个文件,用SPIRNG MVC或者其他方法都可以了,还用
REST这个方法?