Jersey 开发RESTful(十二)Jersey上传下载
更新时间:2018-06-02 | 阅读量(822)
【原创文章,转载请注明原文章地址,谢谢!】
>在本节中,我们将简单介绍Jersey中的上传下载,和Response的使用。
##上传
在Jersey中的上传相对来说还是比较简单的。首先要了解的是,Jersey针对multipart需要专门的支持,首先在maven中添加multipart的依赖:
org.glassfish.jersey.media
jersey-media-multipart
2.25
接着,需要在Jersey中引入MultipartFeature。MultiPartFeature是Jersey中针对Multipart的一种特征(Feature,Feature是JAX-RS中的一种规范,可以视为一种特殊的meta-provider,通常把多个相同类型的Provider封装到一起,比如针对多种encoding的Provider打包注册);
在Jersey中有几种注册MultipartFeature的方式:
1,在web.xml中注册:只需要在Jersey的ServletContainer中添加initparam即可:
jersey.config.server.provider.classnames
org.glassfish.jersey.media.multipart.MultiPartFeature
2,如果是使用Servlet3.0的方式启动,需要在ResourceConfig中添加MultipartFeature:
@ApplicationPath("webapi")
public class RestApplication extends ResourceConfig {
public RestApplication() {
this.packages("cn.wolfcode.jersey");
this.register(MultiPartFeature.class);
}
}
配置完成之后,只需要完成对应的资源类即可:
@POST
@Path("image1")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.MULTIPART_FORM_DATA)
public String upload(@FormDataParam("file") InputStream fileInputStream,
@FormDataParam("file") FormDataContentDisposition disposition, @Context ServletContext ctx) {
return "success";
}
简单解释一下这段代码:
1,请求必须是POST的,这个不用多说;
2,请求返回json格式响应;
3,Consumes这次设置的是MediaType.MULTIPART_FORM_DATA,这个很重要,因为要能够上传,需要要求表单的提交格式为multipart/form-data;
4,重点在于资源方法的参数,在这里,我们使用了@FormDataParam(该标签来源于jersey的multipart包),该标签能够在资源方法上绑定请求编码类型为multipart/form-data中的每一个实体项。该标签可以绑定如下一些类型:
+ FormDataBodyPart;
+ List;
+ FormDataContentDisposition;
+ List;
+ InputStream;
在介绍重点对象之前,我们先来简单回顾一下上传的基本概念。我们知道上传的时候,不能使用默认的x-www-form-urlencoded方式,而要选择使用multipart/form-data二进制传输方式,文件的内容才能够正常提交。那么使用Multipart/form-data方式提交,在请求实体中展示的内容如下:

其中,每一段内容(key:name,value:ssss和key:file,value:文件内容)就会被包装到一段content-disposition里面,用于代表本次提交的请求参数和请求文件内容;
明确请求格式之后,我们重点来关注三个对象:
1,FormDataBodyPart:对使用multipart/form-data编码请求实体的中的每一段实体内容的封装;提供了一些常见的方法:
//获取某一段实体请求的名字;
System.out.println(bp.getName());
//获取某一段实体请求的值(该方法只能作用于text/plain内容)
System.out.println(bp.getValue());
//获取某一段实体请求的封装对象,得到一个BodyPartEntity对象,可以调用getInputStream()方法获取实体内容等;
System.out.println(bp.getEntity());
//可以将请求转化为输入流(这也是一种获取上传文件内容的方法);
InputStream is=bp.getValueAs(InputStream.class);
//包装成FormDataContentDisposition对象返回;
FormDataContentDisposition disp=bp.getFormDataContentDisposition();
2,FormDataContentDisposition:对multipart/form-data中一段content-disposition的封装,较之FormDataBodyPart提供了更高级的方法抽象:
//获取文件名;
System.out.println("getFileName : " + disposition.getFileName());
//获取字段名称,即