这次学习CXF WebService传输文件。CXF采用的是MTOM的机制进行文件传输。MTOM(Message Transmission Optimization Mechanism)消息优化传输机制。消息传输优化机制 (MTOM) 标准允许将消息中包含的大型数据元素外部化,并将其作为无任何特殊编码的二进制数据随消息一起传送。MTOM 消息会打包为多部分/相关 MIME 序列,放在SOAP 消息中一起传送。
但是在大量数据情况下,如果数据依然进行Base64编码,会带来33%的额外开销,这样的情况对于大量数据交换的情况是无法容忍的。MTOM 就是针对SOAP 消息传输的基础上提出的改进办法。对于大量数据的传递,不会进行进行Base64编码,而是直接以附件的二进制原始数据的形式封装在SOAP消息的 MIME 部分,进行传输。………此处略去1000字,自己百度补齐………
首先还是要介绍一下开发工具和开发环境,jdk1.6.0_43+Tomcat6.0.29+MyEclipse10.5,没有使用Maven进行管理!
继续学习达拉斯母牛的CXF实战之传输文件(六),
博客地址:http://blog.csdn.net/accountwcx/article/details/47165321
一、新建web工程,选择Java EE5.0
二、新建文件传输类CxfFileWrapper.java
package com.util;
import javax.activation.DataHandler;
import javax.xml.bind.annotation.XmlMimeType;
import javax.xml.bind.annotation.XmlType;
/**
* 类名: CxfFileWrapper.java
* 作者:张述飞
* 创建时间: 2016-1-7下午2:35:44
* 版本: V1.0
* 功能描述: CXF上传和下载文件对象包装类由于CXF的DataHandler无法获取文件名和文件类型,需要在上传和下载时附带文件名
*/
@XmlType(name = "cxfFileWrapper")
public class CxfFileWrapper{
//文件名
private StringfileName;
//文件扩展名
private StringfileExtension;
//文件二进制数据
private DataHandlerfile;
public String getFileName() {
returnfileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public String getFileExtension() {
returnfileExtension;
}
public void setFileExtension(String fileExtension) {
this.fileExtension = fileExtension;
}
//注解该字段为二进制流
@XmlMimeType("application/octet-stream")
public DataHandler getFile() {
returnfile;
}
public void setFile(DataHandler file) {
this.file = file;
}
}
三、新建接口类FileInterface.java
package com.util;
importjavax.jws.WebMethod;
importjavax.jws.WebParam;
importjavax.jws.WebService;
importjavax.xml.ws.soap.MTOM;
/**
* 类名:FileInterface.java
* 作者: 张述飞
* 创建时间: 2016-1-12上午8:24:05
* 版本: V1.0
* 功能描述:接口类
* 说明:@MTOM注解非常重要,如果不写,那么下载文件时会报内存溢出的错误!
2016-1-8 15:14:29org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet CXFService threwexception
java.lang.OutOfMemoryError:Java heap space
at com.sun.xml.bind.v2.util.ByteArrayOutputStreamEx.readFrom(ByteArrayOutputStreamEx.java:75)
……………………………
*/
@WebService(name="fileInterface")
@MTOM
public interfaceFileInterface {
/**
* 文件上传
*@param file
*@return
*/
@WebMethod
public boolean upload(@WebParam(name ="file") CxfFileWrapper file);
/**
* 文件下载
*@return
*@throws Exception
*/
@WebMethod
public CxfFileWrapper download();
}
四、新建接口实现类FileInterfaceImpl.java
package com.util;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.jws.WebService;
@WebService(endpointInterface="com.util.FileInterface", portName="FileInterPort")
public class FileInterfaceImplimplements FileInterface {
public boolean upload(CxfFileWrapper file) {
boolean result =true;
OutputStream os = null;
InputStream is = null;
BufferedOutputStream bos = null;
try {
is = file.getFile().getInputStream();
/**
* 注必须先在D盘新建文件夹newFile
java.io.FileNotFoundException: d:\newFile\LoginDB.bak (系统找不到指定的路径。)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.<init>(FileOutputStream.java:194)
*/
File dest = new File("d:\\newFile\\" + file.getFileName());
os = new FileOutputStream(dest);
bos = new BufferedOutputStream(os);
byte[] buffer =new byte[100000];
int len = 0;
while ((len = is.read(buffer)) != -1) {
bos.write(buffer, 0, len);
}
bos.flush();
} catch (IOException e) {
e.printStackTrace();
result = false;
} finally {
if (bos !=null) {
try {
bos.close();
} catch (IOException e) {
}
}
if (os !=null) {
try {
os.close();
} catch (IOException e) {
}
}
if (is !=null) {
try {
is.close();
} catch (IOException e) {
}
}
}
return result;
}
/**
* 说明:此处导出的数据库文件大约1.8G,但是没有找到从服务上下载文件的实例
*/
public CxfFileWrapper download() {
String filePath = "D:\\ERPDB\\LoginDB.bak";
CxfFileWrapper fileWrapper = new CxfFileWrapper();
fileWrapper.setFileName("LoginDB");
fileWrapper.setFileExtension("bak");
DataSource source = new FileDataSource(new File(filePath));
fileWrapper.setFile(new DataHandler(source));
return fileWrapper;
}
}
五、applicationContext.xml
<?xmlversion="1.0"encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:http-conf="http://cxf.apache.org/transports/http/configuration"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="
http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.2.xsd
http://cxf.apache.org/transports/http/configurationhttp://cxf.apache.org/schemas/configuration/http-conf.xsd
http://cxf.apache.org/jaxwshttp://cxf.apache.org/schemas/jaxws.xsd">
<importresource="classpath:META-INF/cxf/cxf.xml"/>
<importresource="classpath:META-INF/cxf/cxf-servlet.xml"/>
<http-conf:destinationname="*.http-destination">
<http-conf:serverReceiveTimeout="90000"/>
</http-conf:destination>
<beanid="fileInterface"class="com.util.FileInterfaceImpl"/>
<jaxws:endpointid="myfile"implementor="#fileInterface"address="/upfile">
<jaxws:inInterceptors>
<beanclass="org.apache.cxf.interceptor.LoggingInInterceptor"></bean>
</jaxws:inInterceptors>
<jaxws:outInterceptors>
<beanclass="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean>
</jaxws:outInterceptors>
<jaxws:properties>
<!-- 开启MTOM-->
<entrykey="mtom_enabled"value="true"></entry>
</jaxws:properties>
</jaxws:endpoint>
<!--利用Spring调用-->
<beanid="client"class="com.util.FileInterface"factory-bean="clientFactory"factory-method="create"/>
<beanid="clientFactory"class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
<propertyname="serviceClass"value="com.util.FileInterface"></property>
<propertyname="address"value="http://localhost:8080/WbFile/upfile"></property>
<propertyname="properties">
<map><entrykey="mtom-enable"value="true"></entry></map>
</property>
</bean>
</beans>
六、web.xml
<?xmlversion="1.0"encoding="UTF-8"?>
<web-appversion="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name></display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:applicationContext.xml
</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--Spring刷新Introspector防止内在泄露-->
<listener>
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener>
<servlet>
<servlet-name>CXFService</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CXFService</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
七、需导入的jar包
aopalliance-1.0.jar
asm-3.3.1.jar
commons-logging-1.1.3.jar
cxf-core-3.0.7.jar
cxf-manifest.jar
cxf-rt-bindings-soap-3.0.7.jar
cxf-rt-databinding-jaxb-3.0.7.jar
cxf-rt-frontend-jaxws-3.0.7.jar
cxf-rt-frontend-simple-3.0.7.jar
cxf-rt-transports-http-3.0.7.jar
cxf-rt-transports-http-jetty-3.0.7.jar
cxf-rt-ws-addr-3.0.7.jar
cxf-rt-ws-policy-3.0.7.jar
cxf-rt-wsdl-3.0.7.jar
geronimo-javamail_1.4_spec-1.7.1.jar
geronimo-jaxws_2.2_spec-1.2.jar
jaxb-api-2.2.11.jar
jaxb-core-2.2.11.jar
jaxb-impl-2.2.11.jar
jetty-continuation-8.1.15.v20140411.jar
jetty-http-8.1.15.v20140411.jar
jetty-io-8.1.15.v20140411.jar
jetty-security-8.1.15.v20140411.jar
jetty-server-8.1.15.v20140411.jar
jetty-util-8.1.15.v20140411.jar
neethi-3.0.3.jar
servlet-api.jar
slf4j-api-1.7.9.jar
slf4j-jdk14-1.7.9.jar
spring-aop-3.2.14.RELEASE.jar
spring-beans-3.2.14.RELEASE.jar
spring-context-3.2.14.RELEASE.jar
spring-core-3.2.14.RELEASE.jar
spring-expression-3.2.14.RELEASE.jar
spring-web-3.2.14.RELEASE.jar
stax2-api-3.1.4.jar
woodstox-core-asl-4.4.1.jar
wsdl4j-1.6.3.jar
xmlschema-core-2.2.1.jar
八、新建测试类Client.java
package com.test;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import com.util.CxfFileWrapper;
import com.util.FileInterface;
public class Client {
public void upload(){
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setServiceClass(FileInterface.class);
factory.setAddress("http://localhost:8080/WbFile/upfile");
factory.getInInterceptors().add(new LoggingInInterceptor());
factory.getOutInterceptors().add(new LoggingOutInterceptor());
FileInterface fileinter = factory.create(FileInterface.class);
CxfFileWrapper fileWrapper = new CxfFileWrapper();
fileWrapper.setFileName("LoginDB.bak");
fileWrapper.setFileExtension("bak");
String filePath = "D:\\ERPDB\\LoginDB.bak";
DataSource source = new FileDataSource(new File(filePath));
fileWrapper.setFile(new DataHandler(source));
boolean success = fileinter.upload(fileWrapper);
System.out.println(success ?"上传成功!":"上传失败!");
}
/**
* 下载本地文件到C盘
*/
public void downFile1(){
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setServiceClass(FileInterface.class);
factory.setAddress("http://localhost:8080/WbFile/upfile");
FileInterface fin = factory.create(FileInterface.class);
CxfFileWrapper xfw = fin.download();
OutputStream os = null;
InputStream is = null;
BufferedOutputStream bos = null;
try {
is = xfw.getFile().getInputStream();
File dest = new File("c:\\"+xfw.getFileName()+"."+xfw.getFileExtension());
os = new FileOutputStream(dest);
bos = new BufferedOutputStream(os);
byte[] buffer =new byte[100000];
int len = 0;
while ((len = is.read(buffer)) != -1) {
bos.write(buffer, 0, len);
}
bos.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (bos !=null) {
try {
bos.close();
} catch (IOException e) {
}
}
if (os !=null) {
try {
os.close();
} catch (IOException e) {
}
}
if (is !=null) {
try {
is.close();
} catch (IOException e) {
}
}
}
}
/**
* 从服务器上下载文件到本地,需要在服务器安装tomcat,
* 然后建立一个MyFile.xml文件,需要指向虚拟目录
*/
public void downFile2(){
OutputStream os = null;
InputStream is = null;
try {
String filePath = "http://172.16.0.2:8080/MyFile/2016010501.zip";
URL url = new URL(filePath);
is = url.openStream();
os = new FileOutputStream(new File("c:\\1.zip"));
int width = is.available();
byte[] b =new byte[width];
int i = 0;
while ((i = is.read(b)) > 0) {
os.write(b, 0, i);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (os !=null) {
try {
os.close();
} catch (IOException e) {
}
}
if (is !=null) {
try {
is.close();
} catch (IOException e) {
}
}
}
}
public static void main(String[] args)throws Exception {
//new Client().downFile1();
new Client().upload();
}
}
=====================================================================
这里注意先要启动Tomcat服务器,再运行Client,在客户端会显示:上传成功
九、新建Spring测试类
package com.test;
import java.io.File;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import org.springframework.context.ApplicationContext;
importorg.springframework.context.support.ClassPathXmlApplicationContext;
import com.util.CxfFileWrapper;
import com.util.FileInterface;
public class ClientWithSpring {
public void upload(){
ApplicationContext con = new ClassPathXmlApplicationContext("applicationContext.xml");
FileInterface fileinter = con.getBean("client",FileInterface.class);
CxfFileWrapper xcfile = new CxfFileWrapper();
xcfile.setFileName("LoginDB.bak");
xcfile.setFileExtension("bak");
String filePath = "D:\\ERPDB\\LoginDB.bak";
DataSource source = new FileDataSource(new File(filePath));
xcfile.setFile(new DataHandler(source));
boolean success = fileinter.upload(xcfile);
System.out.println(success ?"上传成功!":"上传失败!");
}
public static void main(String[] args)throws Exception {
new ClientWithSpring().upload();
}
}
启动Tomcat服务器,再运行ClientWithSpring,在客户端会显示:上传成功
已过而立之年的老码农,还在学习一些新知识!因为爱,所以坚持;因为上有老,下有小,所以也要坚持,致过了而立之年还在坚持写代码的码农们,在做好工作的前提下,好好陪陪家人孩子,有时间多回家看看父母,同时也要好好锻炼身体,毕竟你就是家里的天!!!……
代码下载地址:
http://download.csdn.net/detail/zhangshufei8001/9402666
相关推荐
本篇文章将深入探讨如何使用CXF3.0.2和Spring3.2.14这两个强大的开源框架来实现文件的传输。CXF是一个流行的Java Web服务框架,而Spring则为应用程序开发提供了全面的框架支持。 首先,让我们了解CXF3.0.2在文件...
图形化a+b,可以锻炼你的记忆力和算数速度
柔性输送线sw18可编辑全套技术资料100%好用.zip
本汽车票网上预订系统管理员和用户。管理员功能有个人中心,用户管理,汽车票管理,订单管理,退票管理,换票管理,反馈管理,留言板管理,系统管理等。用户功能有个人中心,汽车票管理,订单管理,退票管理,换票管理,反馈管理等。 内含文档,可轻松上手。
自动锁螺丝机细化完全step全套技术资料100%好用.zip
【创新无忧】基于matlab龙格库塔算法RUN优化极限学习机KELM故障诊断【含Matlab源码 10715期】.zip
pll电荷泵锁相环 cppll(已流片)仿真环境搭建好了 电路到版图都已流片验证,另外送PLL书籍电子版和对应工艺库。 另加50就可以得到完整版图 三阶二型锁相环 参考频率50-100MHz 分频比可调 锁定频率600M-2GHz 锁定时间4us 环形振荡器 ring vco 鉴频鉴相器PFD模块 分频器DIV模块 ,ps counter 电荷泵CP模块
智慧社区有管理员和客户两个角色。客户功能有车位信息,社区信息,周边服务,问卷调查,爱心助老,通知公告,留言反馈,个人中心,客服中心,在线报修管理,投诉建议管理,车位租买管理,社区信息管理,参与答卷管理,我的收藏管理。管理员功能有个人中心,客户管理,在线报修管理,投诉建议管理,车位信息管理,车位租买管理,社区信息管理,周边服务管理,问卷调查管理,参与答卷管理,爱心助老管理,留言板管理,系统管理。 内含文档,可轻松上手。
本科生课程设计封面.doc
展示PRD文档的关键要素编写具体示例。同时提供了一份模板,方便撰写PRD文档。
基于matlab的用于分析弧齿锥齿轮啮合轨迹的程序,输出齿轮啮合轨迹及传递误差。 程序已调通,可直接运行。 程序保证可直接运行。
【创新无忧】基于matlab向量加权平均算法INFO优化极限学习机KELM故障诊断【含Matlab源码 10732期】.zip
仓库管理系统(一个毕设) 毕业设计项目《仓库管理系统(manager_sys)》的概述和指南: 项目标题 《基于Spring MVC和Vue.js的仓库管理系统设计与实现 —— 毕业设计项目》 项目概述 本项目是一个基于Spring MVC、Spring Security、Spring、MyBatis、PageHelper和Vue.js框架的仓库管理系统。系统旨在提供高效、安全的库存管理解决方案,包括权限管理、商品管理、订单处理和库存预警等功能。 系统特点 权限管理:利用Spring Security实现基于角色的访问控制(RBAC),动态分配权限。 业务流程:涵盖商品、订单、库存的完整操作流程,确保库存管理的准确性。 日志记录:通过Spring AOP实现操作日志的记录,便于追踪和审计。 数据统计:首页展示商品销量统计图和每日销售统计图,直观展示业务状况。 系统预览 登录和首页:用户登录后进入系统首页,查看统计信息。 产品管理:管理商品信息,包括添加、修改、删除等操作。 订单管理:处理订单,包括创建订单、更新库存等。 权限管理:管理用户角色和权限。 日志管理:查看系统操作日志。 运
A星算法 A*算法 自己研究编写的Matlab路径规划算法 Astar算法走迷宫 可自行设置起始点,目标点,自由更地图。 ——————————————————— 可以和人工势场法融合 动态障碍物
《MATLAB神经网络原理与实例精解》是一本深度学习初学者的理想教程,它全面涵盖了神经网络的基础理论以及MATLAB实现方法。这本书旨在帮助读者理解神经网络的工作原理,并通过具体的MATLAB实例,让读者能够动手实践,从而深入掌握神经网络在实际问题中的应用。 神经网络是一种模仿人脑神经元结构的计算模型,它由大量的处理单元——神经元组成,通过权重连接形成复杂的网络结构。在深度学习领域,神经网络被广泛用于图像识别、语音识别、自然语言处理等任务,因其强大的非线性建模能力而备受青睐。 MATLAB作为一个强大的数值计算和数据可视化环境,为构建和训练神经网络提供了便利的工具箱。MATLAB神经网络工具箱(Neural Network Toolbox)包含了各种类型的神经网络模型,如前馈网络、卷积网络、递归网络等,以及训练算法,如反向传播、遗传算法等。通过这些工具,用户可以快速构建网络结构,调整参数,进行训练和验证,并将模型应用于实际数据。 本书首先会介绍神经网络的基本概念,包括感知机、多层前馈网络和反向传播算法。然后,将详细讲解如何在MATLAB中搭建这些网络,包括网络结构的设计、权重初始
Matlab领域上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
ABAQUS动,静力学模型;车辆-轨道耦合动力学;钢轨不平顺程序;批量非线性弹簧;单向弹簧(收拉不受压或受压不受拉),温度耦合等。 轨道检算(超高,超限,出报告);土木建筑有限元建模分析。
教学督导检查情况表.docx
基于springboot的逍遥大药房管理系统--论文.zip