0
点赞
收藏
分享

微信扫一扫

JAX-RS之上传文件

今天学习的是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这个方法?

举报

相关推荐

0 条评论