使用Axis2传输附件(AXIS2 MTOM)--1

版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。 http://zhangjunhd.51cto.com/113473/26960
本文介绍如何使用Axis2 传递附件。
author: ZJ 07-5-7
?
1 .工作环境
IDE: Eclipse 3.1.2
jdk: jdk1.5.0_04
Tomcat: apache-tomcat-5.0.28
AXIS2:1.0(war 版本和bin 版本)
?
2 .实现
?? Eclipse 新建一个动态web 工程,在WEB-INF"lib 下加入axis2 所需的jar 包。
本例的是一个系统的用户上传下载图片格式文件的例子,每次上传出携带附件外,还包括文件名, 文件类型。此webservice 实现的2 个功能就是upload, download.
??AXIS2 webservice 发布的时候是打包成xxx.aar 发布的,xxx.aar 展开后的目录结构为
?--
??? --META-INF
?????? services.xml
??? -- 包含server 端实现的class( 目录跟package 是一样的结构)
?
3 .服务器端FileTransferServer.java
package sample;
?
import org.apache.axiom.attachments.utils.IOUtils;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axiom.om.OMText;
import org.apache.axis2.AxisFault;
?
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
?
import java.util.Iterator;
?
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
?
public class FileTransferServer {
?????? public static final String TMP_PATH = "D:/temp";
?
?????? public OMElement upload(OMElement element) throws Exception {
????????????? OMElement _fileContent = null;// 文件内容
????????????? OMElement _fileName = null;// 文件名
????????????? OMElement _fileType = null;// 文件类型
????????????? System.out.println("The element for upload: " + element);
????????????? for (Iterator _iterator = element.getChildElements(); _iterator
??????????????????????????? .hasNext();) {
???????????????????? OMElement _ele = (OMElement) _iterator.next();
???????????????????? if (_ele.getLocalName().equalsIgnoreCase("fileContent")) {
??????????????????????????? _fileContent = _ele;
???????????????????? }
???????????????????? if (_ele.getLocalName().equalsIgnoreCase("fileName")) {
??????????????????????????? _fileName = _ele;
???????????????????? }
???????????????????? if (_ele.getLocalName().equalsIgnoreCase("fileType")) {
????????????? ????????????? _fileType = _ele;
???????????????????? }
????????????? }
?
????????????? if (_fileContent == null || _fileType == null) {
???????????????????? throw new AxisFault("Either Image or FileName is null");
????????????? }
?
????????????? OMText binaryNode = (OMText) _fileContent.getFirstOMChild();
????????????? String fileName = _fileName.getText();
????????????? String fileType = _fileType.getText();
????????????? String storeDir = TMP_PATH + "/" + "tempTest";
????????????? File dir = new File(storeDir);
????????????? if (!dir.exists()) {
???????????????????? dir.mkdir();
????????????? }
????????????? String filePath = storeDir + "/" + fileName + "." + fileType;
????????????? File uploadFile = new File(filePath);
????????????? if (uploadFile.exists()) {
???????????????????? filePath = storeDir + "/" + fileName + "(1)" + "." + fileType;
???????????????????? uploadFile = new File(filePath);
????????????? }
?
????????????? // Extracting the data and saving
????????????? DataHandler actualDH;
????????????? actualDH = (DataHandler) binaryNode.getDataHandler();
?
????????????? FileOutputStream imageOutStream = new FileOutputStream(uploadFile);
????????????? InputStream is = actualDH.getInputStream();
????????????? imageOutStream.write(IOUtils.getStreamAsByteArray(is));
????????????? // setting response
????????????? OMFactory fac = OMAbstractFactory.getOMFactory();
????????????? OMNamespace ns = fac.createOMNamespace("http://example.org/filedata",
??????????????????????????? "fd");
????????????? OMElement ele = fac.createOMElement("response", ns);
????????????? ele.setText("true");
????????????? return ele;
?????? }
?
?????? public OMElement download(OMElement element) throws Exception {
????????????? System.out.println("The element for download: " + element);
????????????? OMElement _userName = null;
????????????? OMElement _fileName = null;
????????????? OMElement _fileType = null;
????????????? for (Iterator _iterator = element.getChildElements(); _iterator
??????????????????????????? .hasNext();) {
???????????????????? OMElement _ele = (OMElement) _iterator.next();
???????????????????? if (_ele.getLocalName().equalsIgnoreCase("userName")) {
??????????????????????????? _userName = _ele;
???????????????????? }
???????????????????? if (_ele.getLocalName().equalsIgnoreCase("fileName")) {
??????????????????????????? _fileName = _ele;
???????????????????? }
???????????????????? if (_ele.getLocalName().equalsIgnoreCase("fileType")) {
??????????????????????????? _fileType = _ele;
???????????????????? }
????????????? }
????????????? String userName = _userName.getText();
????????????? String fileName = _fileName.getText();
????????????? String fileType = _fileType.getText();
????????????? String filePath = TMP_PATH + "/" + userName + "/" + fileName + "."
??????????????????????????? + fileType;
????????????? System.out.println("The filePath for download: " + filePath);
????????????? FileDataSource dataSource = new FileDataSource(filePath);
????????????? DataHandler expectedDH = new DataHandler(dataSource);
????????????? OMFactory fac = OMAbstractFactory.getOMFactory();
????????????? OMNamespace ns = fac.createOMNamespace("http://example.org/filedata",
??????????????????????????? "fd");
????????????? OMText textData = fac.createOMText(expectedDH, true);
????????????? OMElement ele = fac.createOMElement("response", ns);
????????????? ele.addChild(textData);
????????????? return ele;
?????? }
}
?
4.services.xml
???
??????? This is a sample Web Service with two operations,echo and ping.
???
??? sample.FileTransferServer
???
??????? urn:upload
???????
???
?????
??????? urn:download
???????
???
?
将这两个文件打包并部署到Tomcat 上(略)。
?
5 .测试
FileTransferClient.java
package sample;
?
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
?
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
?
import org.apache.axiom.attachments.utils.IOUtils;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axiom.om.OMText;
import org.apache.axiom.soap.SOAP11Constants;
import org.apache.axis2.AxisFault;
import org.apache.axis2.Constants;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;
?
public class FileTransferClient {
?? private static EndpointReference targetEPR =
?new EndpointReference("http://127.0.0.1:8080/axis2/services/FileOperation");
??
?? public static boolean upload(String fileName, File file, String fileType) {
???? try {
????? OMElement data = buildUploadEnvelope(fileName, file, fileType);
????? Options options = buildOptions();
????? ServiceClient sender = new ServiceClient();
????? sender.setOptions(options);
????? System.out.println("The data in method upload: "+data);
????? OMElement ome = sender.sendReceive(data);
????? System.out.println("Convert the data to element in method upload: "+ome);
????? String b = ome.getText();
????? return Boolean.parseBoolean(b);
???? }
???? catch(Exception e) {
?????? e.printStackTrace();
???? }
???? return false;
?? }
??
?? public static boolean download(String userName, String fileName, String fileType) {
???? try {
?????? OMElement data = buildDownloadEnvelope(userName, fileName, fileType);
?????? Options options = buildOptions();
?????? ServiceClient sender = new ServiceClient();
?????? sender.setOptions(options);
?????? System.out.println("The data in method download: "+data);
?????? OMElement ome = sender.sendReceive(data);
?????? System.out.println("Convert the data to element in method download: "+ome);
?????? OMText binaryNode = (OMText) ome.getFirstOMChild();
?????? binaryNode.setOptimize(true); // 必须加此句,否则会出现ContentID is null 的异常!
?????? DataHandler actualDH = (DataHandler) binaryNode.getDataHandler();
?????? FileOutputStream imageOutStream = new FileOutputStream("D:/userTemp/xx.gif");
?????? InputStream is = actualDH.getInputStream();
?????? imageOutStream.write(IOUtils.getStreamAsByteArray(is));
?????? return true;
????? }
????? catch(Exception e) {
??????? e.printStackTrace();
????? }
???? return false;
?? }
??
?? private static OMElement buildUploadEnvelope(String fileName, File file, String fileType) {
???? DataHandler expectedDH;
???? OMFactory fac = OMAbstractFactory.getOMFactory();
???? OMNamespace omNs = fac.createOMNamespace("http://example.org/filedata", "fd");
???? OMElement data = fac.createOMElement("upload", omNs);
???? OMElement fileContent = fac.createOMElement("fileContent", omNs);
???? FileDataSource dataSource = new FileDataSource(file);
???? expectedDH = new DataHandler(dataSource);
???? OMText textData = fac.createOMText(expectedDH, true);
???? fileContent.addChild(textData);
??? ?OMElement _fileName = fac.createOMElement("fileName", omNs);
???? _fileName.setText(fileName);
???? OMElement _fileType = fac.createOMElement("fileType", omNs);
???? _fileType.setText(fileType);
???? data.addChild(_fileName);
???? data.addChild(_fileType);
???? data.addChild(fileContent);
???? return data;


礼物 2008-07-10 16:54 发表评论

你可能感兴趣的:(apache,eclipse,tomcat,Web,webservice)