CXF是支持对附件上传的协议MTOM。
MTOM(SOAP Message Transmission Optimization Mechanism)SOAP 消息传输优化机制,可以在SOAP 消息中发送二进制数据,与SAAJ 传输附件不同,MTOM需要XOP(XML-binary Optimized Packing)来传输二进制数据。MTOM 允许将消息中包含的大型数据元素外部化,并将其作为无任何特殊编码的二进制数据随消息一起传送。MTOM 消息会打包为多部分相关 MIME 序列,放在SOAP 消息中一起传送。因此你可以看出MTOM 并不是将附件转为Base64 编码,这样可以大大的提高性能,因为二进制文件转Base64 编码会非常庞大。
MTOM 方式中要传输的附件必须使用javax.activation.DataHandler 类,然后对象类型还要使用@javax.xml.binding.annotation.XmlMimeType 进行注解,标注这是一个附件类型的数据。
这里拿上传及下载用户的图像为例子,大致的说下CXF的MTOM协议对附件的支持
package com.exp.service.outer;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import org.springframework.stereotype.Service;
@Service("HelloWorldImpl")
public class HelloWorldImpl implements HelloWorld {
public String say(String name) {
return name ",您好!";
}
public String sayHello(User user) {
return user.getName() ",您好!";
}
public List getList(Long id){
List list = new ArrayList();
User user = new User();
Long sid=1L;
user.setId(sid);
user.setName("张三" sid);
list.add(user);
user = new User();
sid=2L;
user.setId(sid);
user.setName("张三" sid);
list.add(user);
user = new User();
sid=3L;
user.setId(sid);
user.setName("张三" sid);
list.add(user);
return list;
}
/**
*
* 创 建 人: XX
* 创建时间: 2012-9-26 下午04:50:23
* @param user
* @see [类、类#方法、类#成员]
*/
public void updateUser(User user){
System.out.println("姓名:" user.getName() ",年龄:" user.getAge());
DataHandler handler = user.getImageData();
try {
InputStream is = handler.getInputStream();
OutputStream os = new FileOutputStream(new File("c:\\test11.jpg"));
byte[] b = new byte[100000];
int bytesRead = 0;
while ((bytesRead = is.read(b)) != -1) {
os.write(b, 0, bytesRead);
}
os.flush();
os.close();
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 查询用户信息,包括以附件的形式返回用户的图像
* 创 建 人: XX
* 创建时间: 2012-9-26 下午04:49:43
* @return
* @see [类、类#方法、类#成员]
*/
public User getUser(){
User user =new User(11L,"李四",21);
user.setImageData(new DataHandler(new FileDataSource(new File("d:" File.separator) "test.jpg")));
return user;
}
}
需3积分下载
去下载