Axis2 附件传输 样例 解读

axis2 的客户端发送带附件的过程如下
		//设置options
		Options options = new Options();
		options.setTo(targetEPR);
		options.setProperty(Constants.Configuration.ENABLE_SWA,
				Constants.VALUE_TRUE);
		options.setSoapVersionURI(SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI);		
		options.setTimeOutInMilliSeconds(1000000);
		options.setTo(targetEPR);
		options.setAction("urn:uploadFile");

		//获取context
		String base = System.getenv("AXIS2_HOME");
		ConfigurationContext configContext = ConfigurationContextFactory
				.createConfigurationContextFromFileSystem(base+File.separator+"repository",
						null);

		//创建发送客户端
		ServiceClient sender = new ServiceClient(configContext, null);
		sender.setOptions(options);
		OperationClient mepClient = sender
				.createClient(ServiceClient.ANON_OUT_IN_OP);

		//创建attach的消息上下文,指定attachid
		MessageContext mc = new MessageContext();
		FileDataSource fileDataSource = new FileDataSource(file);		
		DataHandler dataHandler = new DataHandler(fileDataSource);
		String attachmentID = mc.addAttachment(dataHandler);//重点是这句

		//构建信封(xml消息),并将信封设置到消息上下文中
		SOAPFactory fac = OMAbstractFactory.getSOAP11Factory();
		SOAPEnvelope env = fac.getDefaultEnvelope();
		OMNamespace omNs = fac.createOMNamespace(
				"http://service.soapwithattachments.sample", "swa");
		OMElement uploadFile = fac.createOMElement("uploadFile", omNs);
		OMElement nameEle = fac.createOMElement("name", omNs);
		nameEle.setText(destinationFile);
		OMElement idEle = fac.createOMElement("attchmentID", omNs);
		idEle.setText(attachmentID);
		uploadFile.addChild(nameEle);
		uploadFile.addChild(idEle);
		env.getBody().addChild(uploadFile);
		mc.setEnvelope(env);

		
		//将消息上下文设置到客户端,发送!
		mepClient.addMessageContext(mc);
		mepClient.execute(true);



1)构建信封的过程即使构建xml数据结构
2)MessageContext 分为In 和Out

服务端接受消息过程如下:
       // 获取当前消息上下文
       MessageContext msgCtx = MessageContext.getCurrentMessageContext();
       // 提取附件id,并获取附件二进制流
       Attachments attachment = msgCtx.getAttachmentMap();
       DataHandler dataHandler = attachment.getDataHandler(attchmentID);
       File file = new File(name);
       FileOutputStream fileOutputStream = new FileOutputStream(file);
       // 业务代码,写文件
       dataHandler.writeTo(fileOutputStream);
       fileOutputStream.flush();
       fileOutputStream.close();


服务端发送response给客户端的消息也可以粘贴附件,就是所谓的axis2 下载文件功能
下面代码接上面代码
 		OperationContext opCtx = msgCtx.getOperationContext();
		MessageContext outMsgCtx = opCtx.getMessageContext(WSDLConstants.MESSAGE_LABEL_OUT_VALUE);
		
		DataHandler out = new DataHandler(new FileDataSource(new File("c:\\1.txt")));
		String downloadid = outMsgCtx.addAttachment(out);
		return downloadid;


客户端拿到响应的message时,就可以根据downloadid找到附件的文件流

其他设置可以参考:http://axis.apache.org/axis2/java/core/docs/mtom-guide.html

猜你喜欢

转载自dingchd.iteye.com/blog/1850635