Jersey是什么就不再多做介绍了,做这个的项目背景是,有一个功能需要上传word或者excel文件到我们这边进行数据填充,然后我们把处理好的文件再调用接口上传到别的服务器中。废话不说了,直接代码。
一Jersey服务端接收文件,此处先用form表单作提交演示。
前端页面这里就写个简单的form做个演示。
<form id="" action="xx" method="POST" enctype="multipart/form-data" >
<div style="position: relative;left: 40px;">
导入模板<input type="file" name="file" />
</div>
<div>
<input type="submit" value="提交" />
</div>
</form>
很简单的表单,稍微要注意的点事enctype 一定要设置成“multipart/form-data”,然后action中的路径要写成带ip(本机启动的就用 localhost:)的全路径,因为此处后台是用Jersey写的服务端,相当于跨了项目,所以路径要写全。
服务端代码:
首先pom文件中除了Jersey基本的引用,还需引用下面的依赖
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-multipart</artifactId>
</dependency>
服务端注册类中除了要注册服务端之外还需注册MultiPartFeature.class
public class JerseyConfig extends ResourceConfig {
public JerseyConfig() {
register(JerseyDemo.class);
register(MultiPartFeature.class);
}
}
服务端代码非常简单
@POST
@Path("/upload")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.MULTIPART_FORM_DATA)
public String upload(@FormDataParam("file")InputStream fileStream,
@FormDataParam("file")FormDataContentDisposition disposition,
@Context ServletContext ctx,
@Context HttpServletResponse response,
@Context HttpServletRequest request) throws IOException {
//此时file就是文件转成的输入流
//文件名称
String fileName = disposition.getFileName();
}
Jsery框架会自动把文件转成对应的输入流,就是fileStream,后续就可以对它进行处理,比如是图片了就可以使用ImageIO处理,是excel或者word可以用POI的类进行处理。输入流下面的disposition会包含上传文件的一些信息,比如最常使用的文件名称,还有文件大小等get方法,后面的参数不是必要的。下面说一些注意事项:
1.注意pom文件引用,和注册MultiPartFeature.class,后者一定要切记,不然会报错。
2@FormDataParam("file")InputStream fileStream,
@FormDataParam("file")FormDataContentDisposition disposition, 两段代码中的的参数名称file,要和上面form表单中上传文件的name一致。
3 @Consumes(MediaType.MULTIPART_FORM_DATA) 消费的类型一定要设置成这种类型,不然也无法正常接收文件。
4如果form表单中有别参数需要提交那么还用@FormDataParam(“XXX”)接收。
二客户端向服务端提交文件
上面是用form表单进行提交文件到服务端的,工作中我们也会用程序处理完文件之后再用jersey客户端向服务端提交文件。直接上代码;
FormDataMultiPart part = new FormDataMultiPart();
part.bodyPart(new FileDataBodyPart("file",file));
ClientConfig client = new ClientConfig();
client.register(MultiPartWriter.class);
Client writerClient = ClientBuilder.newClient(cc);
WebTarget target = writerClient.target("/XXX").path("/XXX");
Response response = target.request(MediaType.APPLICATION_JSON_TYPE)
.post(Entity.entity(part, MediaType.MULTIPART_FORM_DATA_TYPE));
简单来说就是模拟一个表单提交
http://javadox.com/com.sun.jersey.contribs/jersey-multipart/1.18/com/sun/jersey/multipart/FormDataMultiPart.html这是主要参数的API可以自己去了解一下。jerse的客户端提交具体原理,比如为什么注册MultiPartWriter.class都还不是很清楚,后续再进行研究。