webservice(axis)接口上传文件附件 及 用zlib解压缩

webservice传文件,我平时用到的webservice框架也就是Axis和CXF,这两种框架都可以用DataHandler进行文件的传输,这种的传的是文件的内容,不会有文件名称,类型,所以这些得自己在接口中加字段;还有一种方式就是将文件转化成字节数组,再用Base64将字节数组编码成字符串类型放入接口字段中进行传输,接受的一方先解码然后存文件。

目前用到的就是后一种,无论前一种还是后一种,两种方式传输的文件都不能太大,前一种具体能传多大不太清楚,后一种十几兆或者二十多兆还是可以传的,只是传输的比较慢,而且接受端要延长超时时间。

关于压缩,目前只在测试环境试了下,而且不知道是不是因为zlib对pdf的压缩是不是不友好,压缩pdf的文件压缩率比较低,我测了下A方压缩后传过来的文件,解压前和解压后差的不太多,压缩率为6%,也就是说10M的只压缩到了9.4M,压不压缩也没什么区别了,因为这次上线时间紧,所以其他的压缩方法也没有来的急试,这次记录就先记录下zlib的压缩/解压缩。

这次顺便也复习了下文件读写的过程,关于输入输出流这位老哥说的挺全的https://blog.csdn.net/msk_zn/article/details/73385467。

一. DataHandler进行文件传输

1.Axis框架

2.CXF框架

注:用这两个框架的DataHandler方式上传文件暂时先不整理,因为暂时没有这方面的需求,所以靠后放放,有时间了补上:)。

二. 编码后传输

1.发送端

发送端要做的就是把文件读取成输入流,然后将输入流读取写入到输出流,然后将输出流转化为字节数组,用Base64编码成String字符串类型的对象,将这个字符串对象放入接口对应的字段中发送就ok了;

 1 InputStream in = new FileInputStream(filePath);
 2 ByteArrayOutputStream out = new ByteArrayOutputStream();
 3 byte[] buffer = new byte[1024];
 4 int n = 0;
 5 while ((n = in.read(buffer)) != -1) {
 6 out.write(buffer, 0, n);
 7 }
 8 byte[] data = out.toByteArray();
 9 in.close();
10
11 BASE64Encoder encoder = new BASE64Encoder();//Base64编码方式很多,自行挑选,注意编码解码用同一种即可。
12 String encodedText = encoder.encode(textByte);

2.接收端

接受端所做的和发送端相反,先将接受到的字符串对象先用Base64解码成字节数组,然后将字节数组转变为字节数组输入流,存入文件;

 1 String content = "发送端传过来的内容";
 2 File destfile = new File("想要存储文件的路径+名称");
 3
 4 BASE64Decoder decoder = new BASE64Decoder();//Base64解码方式较多,自行挑选,注意编码解码用同一种即可。
 5 byte[] bytes = decoder.decodeBuffer(content);
 6 InputStream is = new ByteArrayInputStream(bytes);
 7 byte[] buff = new byte[1024];
 8 int len = 0;
 9 FileOutputStream fos  = new FileOutputStream(destfile);
10 bos = new BufferedOutputStream(fos);
11 while((len=is.read(buff))!=-1){
12        fos.write(buff, 0, len);
13 }
14 is.close();
15 fos.close(); 

三.压缩后传输

本次记录的压缩方法是Zlib,因为项目中用到了所以记录下。网上关于Zlib介绍的文章不少,但是大都千篇一律,来源都是这位老哥的 https://www.iteye.com/blog/snowolf-465433 ,文章中不仅记录了Zlib的压缩和解压缩,还记录了zip的压缩解压缩,Linux下的压缩格式Gzip,BZip2的压缩解压缩,写的很详细,很棒。

1.Zlib的压缩

Zlib压缩的方法有两种,一种是对字节数组进行压缩,另一种是对输出流进行压缩。

2.Zlib的解压缩

解压缩同理,可以对字节数组进行解压缩,也可以对输入进行解压缩。

 1 byte[] bytes = decoder.decodeBuffer(content);
 2 File file=new File(filePath+"/"+fileName);
 3 FileOutputStream fos = new java.io.FileOutputStream(file);
 4 BufferedOutputStream bos = new BufferedOutputStream(fos);
 5
 6 //输入流形式进行解压缩
 7 ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
 8 InflaterInputStream iis = new InflaterInputStream(byteArrayInputStream);
 9 int i = 1024;
10 Integer sum = 0;
11 byte[] buf = new byte[i];
12 while ((i = iis.read(buf, 0, i)) > 0) {
13      bos.write(buf, 0, i);
14 15 }
16 iis.close;
17 bos.close;
 1 byte[] bytes = decoder.decodeBuffer(content);
 2 File file=new File(filePath+"/"+fileName);
 3 FileOutputStream fos = new java.io.FileOutputStream(file);
 4 BufferedOutputStream bos = new BufferedOutputStream(fos);
 5
 6 //字节数组形式解压缩
 7 Inflater decompresser = new Inflater();
 8 decompresser.reset();
 9 decompresser.setInput(bytes);
10 byte[] buf = new byte[1024];
11 while (!decompresser.finished()) {
12     int i = decompresser.inflate(buf);
13     bos.write(buf, 0, i);
14 }
15 bos.close;
16 fos.close;

3.zip的压缩

4.zip的解压缩

注:zip的压缩解压缩暂时没用到,但是在测试的时候也用到了一点,有时间后整理:)。

最后,对于压缩后Base64编码传输的可以参考以上两种方式,先对传输内容进行解码,然后解压缩。好像留的坑挺多,但是基本功能可以实现,等什么时候把内容补全了,再修改文章的标题!

相关文章:

java-文件流正确关闭资源    https://www.cnblogs.com/tfper/p/9833722.html (上文中的文件流关闭并不严谨,关于正确关闭文件流可参考这篇文章)

Java压缩技术   https://www.iteye.com/blog/snowolf-465433

java-将字符串或者字节数组等,转换为输入流     https://blog.csdn.net/y41992910/article/details/80176552

Java输入输出流详解    https://blog.csdn.net/msk_zn/article/details/73385467

原文地址:https://www.cnblogs.com/thePeaceOftheLord/p/12670537.html

时间: 2024-11-09 05:54:29

webservice(axis)接口上传文件附件 及 用zlib解压缩的相关文章

使用python或robotframework调multipart/form-data接口上传文件

这几天调一个multipart/form-data类型的接口,遇到点小阻碍.之前同事有使用urllib库写了个类似的方法实现,比较长,想要改的时候发现不太好使.在网上查找发现用requests库做这个更强大.下面具体介绍一下python-requests及robotframework-RequestsLibrary实现multipart/form-data接口上传文件.1.从fiddler查看接口长这样:Header: WebForms: 2.python-requests实现 #!/usr/b

confluence上传文件附件预览乱码问题(linux服务器安装字体操作)

在confluence上传excel文件,预览时发现乱码问题主要是因为再上传文件的时候一般是Windows下的文件上传,而预览的时候,是linux下的环境,由于linux下没有微软字体,所以预览的时候无法识别文档字体,所以才会出现乱码.还比如某个业务有个功能生成图片,结果图片里的字全变空格了,这也是服务器上没相应的字库造成的.解决办法:在服务器上安装中文字体.操作方法如下: 1)先安装想要的字体, 如楷体等, 从本机"c盘->Windows-Fonts"文件夹里复制simkai字

关于confluence上传文件附件预览查看时出现乱码的问题解决办法

在confluence上传excel文件,预览时发现乱码问题主要是因为再上传文件的时候一般是Windows下的文件上传,而预览的时候,是linux下的环境,由于linux下没有微软字体,所以预览的时候无法识别文档字体,所以才会出现乱码.还比如某个业务有个功能生成图片,结果图片里的字全变空格了,这也是服务器上没相应的字库造成的. 1.解决办法:在服务器上安装中文字体.操作方法如下: 1)先安装想要的字体, 如楷体等, 从本机"c盘->Windows-Fonts"文件夹里复制simk

调用接口上传文件遇到http状态404失败

当上传一个超过30M的文件时,服务器会重定向至404.13页面,报错如下: HTTP Error 404.13 - Not Found The request filtering module is configured to deny a request that exceeds the request content length. 这是由于服务器限制了所能上传文件的最大值.其值在configuration/system.webServer/security/requestFiltering

Jmeter接口上传文件

一.使用抓包软件抓取该接口,查看参数(图例使用的是charles) 可以看到上传文件的参数名是file1 二.把抓取到的普通参数都放在参数这一栏里,如图所示,不要在意马赛克 三.参数名称写在如图所示的位置,就是传文件的参数,文件名称是文件的绝对路径,MIME类型注意跟文件类型匹配,这样就可以啦,完成啦 原文地址:https://www.cnblogs.com/chongzi1990/p/11643664.html

requests通过接口上传文件

如何利用requests上传文件的操作: 抓包发现post请求需要传递参数如下: 代码实现如下:需要带上cookies信息,files需要传递文件名称,传递文件的路径以二进制方式传递,文件的格式. import requests url = "http://admin.cdnzutuan.cn/api/a/upload/uploadappbanner" files = { "file":("蓝天白云.jpg",open(r"D:\ico

C# 使用HttpWebRequest通过PHP接口 上传文件

1:上传文件实例 public void UploadXMLLog(string xmlpath)        {            NameValueCollection nvc = new NameValueCollection();            CookieContainer cookies = new CookieContainer();            nvc.Add("", “”);            ......            strin

上传文件,使用FormData进行Ajax请求,jsoncallback

通过传统的form表单提交的方式上传文件: <form id= "uploadForm" action= "http://localhost:8080/cfJAX_RS/rest/file/upload" method= "post" enctype ="multipart/form-data"> <h1 >测试通过Rest接口上传文件 </h1> <p >指定文件名: <

通过Ajax方式上传文件,使用FormData进行Ajax请求

通过传统的form表单提交的方式上传文件: 1 2 3 4 5 6 7 8 9 <form id= "uploadForm" action= "http://localhost:8080/cfJAX_RS/rest/file/upload" method= "post" enctype ="multipart/form-data">       <h1 >测试通过Rest接口上传文件 </h1&g