使用jersey编写客户端上传文件以及服务端接收文件

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都还不是很清楚,后续再进行研究。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值