首页 > 技术文章 > RESTFul系列文章 >

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方式提交,在请求实体中展示的内容如下: ![image.png](http://upload-images.jianshu.io/upload_images/807144-a47feee515607b70.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/440) 其中,每一段内容(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()); //获取字段名称,即
叩丁狼学员采访 叩丁狼学员采访
叩丁狼头条 叩丁狼头条
叩丁狼在线课程 叩丁狼在线课程