CXF:通过WebService上传文件,包括大文件的处理
参考网上文章,用CXF发布上传文件接口,并上传大文件的测试。
框架:spring3.1+cxf2.7.6
1.定义文件类实体
import javax.activation.DataHandler;
import javax.xml.bind.annotation.XmlMimeType; /**
* CXF上传和下载文件对象包装类 由于CXF的DataHandler无法获取文件名和文件类型,需要在上传和下载时附带文件名
*
*/
public class CxfFileWrapper {
// 文件名
private String fileName = null;
// 文件扩展名
private String fileExtension = null;
// 文件二进制数据
private DataHandler file = null; public final String getFileName() {
return fileName;
} public final void setFileName(String fileName) {
this.fileName = fileName;
} public final String getFileExtension() {
return fileExtension;
} public final void setFileExtension(String fileExtension) {
this.fileExtension = fileExtension;
} // 注解该字段为二进制流
@XmlMimeType("application/octet-stream")
public final DataHandler getFile() {
return file;
} public final void setFile(DataHandler file) {
this.file = file;
}
}
2.定义服务接口
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService; import net.bwda.domain.upload.CxfFileWrapper; @WebService(name = "FileWS", serviceName = "FileWS")
public interface FileWS {
/**
* 文件上传
* @param file 文件上传包装类
* @return 上传成功返回true,上传失败返回false。
*/
@WebMethod
boolean upload(@WebParam(name = "file") CxfFileWrapper file); /**
* 文件下载
* @return 文件
*/
@WebMethod
CxfFileWrapper download();
} import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream; import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource; import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service; import net.bwda.domain.upload.CxfFileWrapper;
import net.bwda.service.upload.FileWS; @Service
@Component("fileWS")
public class FileWSImpl implements FileWS { public boolean upload(CxfFileWrapper file){
boolean result = true;
OutputStream os = null;
InputStream is = null;
BufferedOutputStream bos = null;
try {
is = file.getFile().getInputStream();
File dest = new File("d:\\upload\\" + file.getFileName());
os = new FileOutputStream(dest);
bos = new BufferedOutputStream(os);
byte[] buffer = new byte[1024*1024];
int len = 0;
while ((len = is.read(buffer)) != -1) {
bos.write(buffer, 0, len);
}
bos.flush();
} catch (Exception e) {
e.printStackTrace();
result = false;
} finally {
if(bos != null){
try{
bos.close();
}catch(Exception e){
}
}
if(os != null){
try{
os.close();
}catch(Exception e){
}
}
if(is != null){
try{
is.close();
}catch(Exception e){
}
}
}
return result;
} public CxfFileWrapper download() {
//下载文件的路径
String filePath = "D:\\test.xlsx";
CxfFileWrapper fileWrapper = new CxfFileWrapper();
fileWrapper.setFileName("test.xlsx");
fileWrapper.setFileExtension("xlsx");
DataSource source = new FileDataSource(new File(filePath));
fileWrapper.setFile(new DataHandler(source));
return fileWrapper;
} }
3.定义CXF配置文件

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="
http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"
xmlns:cxf="http://cxf.apache.org/core"> <import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" /> <cxf:bus>
<cxf:properties>
<!-- 定义上传文件的最大长度,限制为256M -->
<entry key="org.apache.cxf.stax.maxTextLength" value="268435456" />
</cxf:properties>
</cxf:bus> <jaxws:endpoint id="fileWSEndpoint" implementor="#fileWS"
address="/file">
<jaxws:properties>
<!-- 开启MTOM -->
<entry key="mtom_enabled" value="true"></entry>
</jaxws:properties>
</jaxws:endpoint> </beans>
更多CXF配置,可参见:https://cxf.apache.org/docs/security.html。
4.生成客户端代码
d:\apache-cxf-2.7.6\bin\wsdl2java.bat -frontend jaxws21 -p com..test.webservice.file -client http://localhost:9080/filemark/webservice/file?wsdl
5.根据自动上传的代码上传文件测试

/**
* Please modify this class to meet your needs
* This class is not complete
*/ import java.io.File;
import java.net.URL; import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.xml.namespace.QName; /**
* This class was generated by Apache CXF 2.7.6
* 2016-11-10T18:37:44.270+08:00
* Generated source version: 2.7.6
*
*/
public final class FileWS_FileWSImplPort_Client { private static final QName SERVICE_NAME = new QName("http://upload.serviceimpl.bwda.net/", "FileWSImplService"); private FileWS_FileWSImplPort_Client() {
} public static void main(String args[]) throws java.lang.Exception {
URL wsdlURL = FileWSImplService.WSDL_LOCATION;
FileWSImplService ss = new FileWSImplService(wsdlURL, SERVICE_NAME);
FileWS port = ss.getFileWSImplPort(); {
System.out.println("Invoking upload...");
net.bwda.Test.webservice.CxfFileWrapper _upload_file = new CxfFileWrapper();
_upload_file.setFileName("test.csv");
_upload_file.setFileExtension("csv");
DataSource source = new FileDataSource(new File("d:\\test.csv"));
_upload_file.setFile(new DataHandler(source));
boolean _upload__return = port.upload(_upload_file);
System.out.println("upload.result=" + _upload__return);
} System.exit(0);
} }
CXF:通过WebService上传文件,包括大文件的处理的更多相关文章
- 使用SAS和JavaScript前端上传Azure Bolb大文件
问题描述: Azure Storage Rest API提供了对于大文件分块上传方法,分别使用Put Block和Put Block List实现相关功能 参考链接: Uploading Large ...
- 如何免费上传4G以上大文件至百度云网盘
百度云网盘的容量高达2048G,因而如今使用百度云网盘的用户也越来越多, 但是百度云中如果要上传超过4G的大文件,必须要升级VIP才行,但这需要收费.那么,超过4G以上的大文件我们该怎样上传到百度云呢 ...
- ASPCMS不能上传2M以上大文件修改!
\admin_aspcms\editor\upload.asp修改80行左右maxattachsize=xxxxxxxx'最大上传大小,默认是2M前提是IIS上传大小已修 其他有关IIS方面的修改: ...
- git上传超过100m大文件
1.git出错如下错误时 执行如下可解决错误: git rm --cache '大文件路径' git commit --amend -CHEAD git push 2.当必须上传大文件时.需借助git ...
- 精讲RestTemplate第6篇-文件上传下载与大文件流式下载
本文是精讲RestTemplate第6篇,前篇的blog访问地址如下: 精讲RestTemplate第1篇-在Spring或非Spring环境下如何使用 精讲RestTemplate第2篇-多种底层H ...
- 20160113006 asp.net实现ftp上传代码(解决大文件上传问题)
using System;using System.Configuration;using System.Data;using System.Linq;using System.Web;using S ...
- 居于H5的多文件、大文件、多线程上传解决方案
文件上传在web应用中是比较常见的功能,前段时间做了一个多文件.大文件.多线程文件上传的功能,使用效果还不错,总结分享下. 一. 功能性需求与非功能性需求 要求操作便利,一次选择多个文件进行上传: 支 ...
- 前端上传视频、图片、文件等大文件 组件Plupload使用指南
demo:https://blog.csdn.net/qq_30100043/article/details/78491993 Plupload上传插件中文帮助文档网址:http://www.phpi ...
- Delphi调用JAVA的WebService上传XML文件(XE10.2+WIN764)
相关资料:1.http://blog.csdn.net/luojianfeng/article/details/512198902.http://blog.csdn.net/avsuper/artic ...
随机推荐
- Android基于mAppWidget实现手绘地图(十)–在放大前后执行一些操作
为了在放大前后执行一些操作,你需要添加MapEventsListener 的实例到MapWidget,使用MapWidget.removeMapEventsListener移除该监听器. mapWid ...
- 启动Genymotion时报错Failed to initialize backend EGL display
在启动Genymotion的时候报错: video card说的是显卡,你的显卡可能不支持 OpenGL2.0,或者你装的驱动有问题. 解决办法:将驱动重新安装一下. 可直接下载一个如“驱动人生“一 ...
- 帮助文档的制作javadoc
将自己写的工具类Tool的Tool.class文件发送给其他人,其他人只要将该文件设置到classpath路径下,就可以使用该工具类. 但是很遗憾,该类中到底定义了多少个方法,对方却不清楚,因为该类并 ...
- 学习ng2,从zonejs开始(非官方翻译) ----angular2系列(一)
Zone是什么: 官方解释:zone.js为JavaScript提供了执行上下文,可以在异步任务之间进行持久性传递. 最开始我一直没理解到这句话,学习过程中我也因为自己的一些失误而一直纠结徘徊,情况是 ...
- AngularJS in Action读书笔记2——view和controller的那些事儿
今天我们来818<angularjs in action>的第三章controller和view. 1.Big Picture概览图 View是angularjs编译html后呈现出来的, ...
- CSS 魔法系列:纯 CSS 绘制基本图形(圆、椭圆等)
我们的网页因为 CSS 而呈现千变万化的风格.这一看似简单的样式语言在使用中非常灵活,只要你发挥创意就能实现很多比人想象不到的效果.特别是随着 CSS3 的广泛使用,更多新奇的 CSS 作品涌现出来. ...
- Android监听来电和去电
要监听android打电话和接电话,只需下面2步骤1.第一步,写一个Receiver继承自BroadcastReceiver import android.app.Service; import an ...
- Microsoft Orleans 之 入门指南
Microsoft Orleans 在.net用简单方法构建高并发.分布式的大型应用程序框架. 原文:http://dotnet.github.io/orleans/ 在线文档:http://dotn ...
- android The connection to adb is down 错误信息
之前运行eclipse执行android应用都没问题,今天突然出问题了,控制台报错: The connection to adb is down, and a severe error has occ ...
- EC笔记,第一部分:3.尽量使用const
03.尽量使用const 1.const概述 2.返回const 为何要返回一个const? 因为如果不返回const,程序员可能写出fun(a,b)=c;这样的代码,也许是因为打字错误可能写出类似i ...