java webservice 传输文件(三)

2014-11-24 09:56:29 · 作者: · 浏览: 2
; out1.close(); }

需要指出的是,不同的BLOB数据,在保存时要对格式进行不同的处理,如果使用上面的方法保存图片,将不能得到正确的结果,需要进行额外的处理。具体的处理方式,已经是本文的题外话了。本案例的详细代码您可以从这里 下载。
下面我们讨论使用附件的形式在SOAP中传输BLOB数据。
回页首
使用附件(Attachment)传输BLOB数据
在SOAP消息中,允许我们像邮件一样发送附件。附件由另一份文档或者份图像内容组成。一般而言,附件应该采用文本或者二进制数据格式来表示。在英特网上,GIF和JPEG数据格式是图形传输的事实标准。SOAP消息允许带有一个或者多个MIME格式的附件。常用的MIME格式有:
text/html:普通的HTML
text/xml:XML文档
text/plain:普通的文本
image/jpeg:JPEG图像
image/tiff:tiff图像
下面是一个带有普通文档文本的SOAP消息的一部分。
例程9 带有附件的SOAP消息
------=_Part_2_25899876.1056182982030 Content-Type: text/xml getImagebyAttachment_Test ------=_Part_2_25899876.1056182982030 Content-Type: text/plain Content-Id: hello hello,this is the soap attachment content! ------=_Part_2_25899876.1056182982030--

上面的黑体字是具体的附件的内容。它的Content-Type是text/plain,id是hello。
SAAJ(SOAP with Attachments API for Java)为发送带附件的SOAP消息提供了编程接口。在编程中,我们使用SOAPMessage对象来创建AttachmentPart(SOAP 附件)对象,如下:
AttachmentPart attachment = soapMessage.createAttachmentPart();

每个AttachmentPart对象有一个或者多个headers和它相关联。Content-Type是Header中必须的元素,其它的元素如:Content-Id,Content-Location是Header中可选的元素。如果要创建一个简单的文本附件,可以使用下面的方式。
例程10创建一个简单的带文本的SOAP附件
String stringContent = " hello,this is the soap attachment content!"; attachment.setContent(stringContent, "text/plain"); attachment.setContentId("test_content"); soapMessage.addAttachmentPart(attachment);

上面创建的附件的MIME类型是text/plain。如果要创建一个图形的MIME附件,可以使用下面的方法。
例程11 创建一个图形的MIME附件
AttachmentPart attachment = soapMessage.createAttachmentPart() byte[] bytes=new byte[1024000]; InputStream in=GetImageByAttachment.class.getResourceAsStream("test.jpg"); in.read(bytes); ByteArrayInputStream stream = new ByteArrayInputStream(bytes); attachment.setContent(stream, "image/jpeg"); attachment.setContentId("test_content"); soapMessage.addAttachmentPart(attachment);

也许你觉得这样创建图形附件比较麻烦,下面有一种相对容易的创建方法。
例程12另一个创建一个图形的MIME附件的方法
URL url = new URL("http://localhost:8080/axis/test.jpg"); DataHandler dh = new DataHandler(url); AttachmentPart attachment2 = message.createAttachmentPart(dh); attachment2.setContentId("myImage"); soapMessage.addAttachmentPart(attachment2);

这里使用了DataHandler对象,它是JavaBean Activation Framework (JAF)的一部分,使用它来创建SOAP附件相对直接,首先创建一个URL,这个URL表示了图像文件存储的位置,然后使用这个URL来创建一个DataHandler对象,接下来就使用这个DataHandler来创建SOAP附件了。
接下来我们来编写一个具体的例子 飧隼 雍颓懊娴睦 右谎 彩窃 OAP消息中传输一个图像文件,不同的是使用附件的方式。
这里的附件端采用了JAXM Servlet,关于JAXM编程的请参考此系列文章的第一篇(用JAXM开发Web服务)。服务端的代码如下:
例程13 SOAP消息发送服务端
package com.hellking.webservice; import org.apache.soap.util.mime.*; import java.net.*; import java.util.*; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import javax.xml.soap.*; import javax.activation.*; import javax.xml.messaging.*; import javax.xml.transform.stream.StreamSource; public class GetImageByAttachment extends JAXMServlet implements ReqRespListener { public SOAPMessage onMessage (SOAPMessage message) { try { message.writeTo(System.out); //以下部分创建SOAP消息 SOAPConnectionFactory soapConnectionFactory = javax.xml.soap.SOAPConnectionFactory.newInstance(); SOAPConnection soapConnection = soapConnectionFactory.createConnection(); MessageFactory messageFactory =