- 浏览: 32451 次
- 性别:
- 来自: 苏州
最新评论
-
yzqnow1234:
需要demo呀
java web service 大文件上传/下载 DataHandler -
yoin528:
应该是在网上拷的才写得那么简略。。。
java web service 大文件上传/下载 DataHandler -
zjc198805:
LZ,要写就写好一点的,上传个demo啥的,这个什么都没有,包 ...
java web service 大文件上传/下载 DataHandler -
zjutsoft:
还有包和类的。都不写清楚。
java web service 大文件上传/下载 DataHandler -
zjutsoft:
代码有错误的
java web service 大文件上传/下载 DataHandler
传输小体积文件(不超过10M)通常采用byte[]来容纳数据内容。开发过程中,通常是以下面给出的代码形式来定义数据类型:
public byte[] download(String fileName);
public void upload(String fileName, byte[] content);
数据内容即以byte[]的方式来容纳。毕竟字节数组的长度是有限的,大体积的数据流显然不适合用如此方式操作。webservice规范中指出:二进制内容在网络传输过程中还能以soap附件的形式收发。
本文将要涉及到的内容是:
使用sun webservices 参考实现版本作为开发和运行环境
通过Webservice上载或下载大体积的文件(至少是500M以上)。
采用annotation的注解方式开启webservice的消息传输优化。
使用DataHandler操作输入输出流。
知识点
Webservice 通过“附件”的形式可把多个二进制内容粘贴到消息的附件部位上。因此在编程的过程中既可以直接操纵webservice的原始消息内容(使用soap的消 息操作API)进行“附件”的读写也能使用客户端存根代码的java代理类进行操作。Web service规范中的一项: MTOM (Message Transmission and Optimization Mechanism)即是进行此项操作的用场。
数据内容和JAVA的数据类型
下表列举了在http传输过程中媒体内容的类型和JAVA编程对象的对应关系
MIME Type |
Java Type |
image/gif |
java.awt.Image |
image/jpeg |
java.awt.Image |
text/plain |
java.lang.String |
text/xml or application/xml |
javax.xml.transform.Source |
*/* |
javax.activation.DataHandler |
以图片的内容来解释下传输类型的转换过程:
java.awt.Image类型的对象在传输前按照image/gif;image/jpeg的编码规则(HTTP上媒体字节内容的编码规则)进行编码,而后写到soap消息中;从soap消息里还原出媒体内容的时候即还原成java.awt.Image的对象实例。
*/*这种类型就是“通吃”了,完全依靠DataHandler的实现提供输入输出流来操作媒体内容。这种类型就是本文要采用的。
代码讲解
先来看上载文件的服务端。webservice的实现类用annotation标注以开启MTOM方式
@javax.xml.ws.soap.MTOM
public class MTOMServer {
...
}
上载的功能
public void upload(
@WebParam(name="fileName")String fileName,
@XmlMimeType("*/*")
@WebParam(name="fileDataHandler")
DataHandler dataHandler)throws IOException
用DataHandler充当上载的数据操作的“手柄”,并且明确地使用 @XmlMimeType("*/*")标注以表示采用数据流的方式把媒体内容写到SOAP消息的附件部位。(如果不明确地进行标记,那么客户端存根代码上就不会出现DataHandler,而是byte[])。
下载的功能
@WebResult
@XmlMimeType("*/*")
public DataHandler download(
@WebParam(name="fileName")String fileName
)throws FileNotFoundException{
同样显示地标注*/*表示客户端将得到DataHandler(如果不明确地进行标记,那么客户端存根代码上就不会出现DataHandler,而是byte[])
客户端也能开启MTOM。开启的方式可以在获取服务的时候指出:
public MTOMServerService getMTOMServer(WebServiceFeature... features)
实参用MTOMFeature的实例。
客户端调用上载方法前还需为请求的上下文环境指定“流操作的块的大小”
Map<String, Object> ctxt = ((BindingProvider)mtomPort).getRequestContext();
ctxt.put(JAXWSProperties.HTTP_CLIENT_STREAMING_CHUNK_SIZE, 2048);
以下贴出服务端代码
package mtom; import javax.jws.*; import javax.xml.bind.annotation.*; import javax.xml.ws.*; import javax.activation.*; import javax.annotation.*; import java.io.*; import java.util.*; /** * @author Hardneedl */ @javax.xml.ws.soap.MTOM @WebService(name="MTOMServerService",portName="MTOMServer") public class MTOMServer { private static final int BUFFER_SIZE = 1024*1024*20; @Resource private WebServiceContext serviceContext; /** * 下载文件 * @return 数据句柄 */ @WebResult @XmlMimeType("*/*") public DataHandler download( @WebParam(name="fileName")String fileName)throws FileNotFoundException{ if (fileName==null||fileName.isEmpty()) throw new FileNotFoundException("file name is empty"); File dir = getFileDepository(); File downloadFile = new File(dir.getAbsolutePath()+File.separatorChar+fileName); if (!downloadFile.exists()) throw new FileNotFoundException(fileName + " does not exist"); return new DataHandler( new FileDataSource(downloadFile){ public String getContentType() { return "application/octet-stream"; } } ); } @WebResult @XmlMimeType("*/*") public DataHandler[] downloadMulti()throws FileNotFoundException{ final File[] files = getFileDepository().listFiles(); DataHandler[] handlers = new DataHandler[files.length]; for (int i = 0,j=files.length; i < j; i++){ final String fileName = files[i].getName(); handlers[i]= new DataHandler(new FileDataSource(files[i])){ public String getName() {return fileName;} }; } return handlers; } /** * 上载 * @param fileName 待上载的文件名 * @param dataHandler 数据句柄 * @throws IOException IO异常 */ public void upload( @WebParam(name="fileName")String fileName, @XmlMimeType("*/*") @WebParam(name="fileDataHandler") DataHandler dataHandler)throws IOException{ File depository = getFileDepository(); InputStream in = dataHandler.getInputStream(); OutputStream out = new FileOutputStream(depository.getAbsolutePath()+File.separatorChar+fileName); byte[] buf = new byte[BUFFER_SIZE]; int read; while( (read=in.read(buf))!=-1 ) { out.write(buf,0,read); out.flush(); } in.close(); out.close(); } /** * 列表文件清单 * @return 文件清单 */ public java.util.List<FileDescription> listFiles(){ File fileDepository = getFileDepository(); java.util.List<FileDescription>L=new java.util.ArrayList<FileDescription>(0); for (File f : fileDepository.listFiles()) { FileDescription fds = new FileDescription(); Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(f.lastModified()); fds.setModifiedDate(cal); fds.setFileName(f.getName()); fds.setLength(f.length()); L.add(fds); } return L; } /** * 获取临时上载文件的路径 * @return 临时文件路径 */ private static File getFileDepository(){ return new File(System.getProperty("java.io.tmpdir")); } }
客户端代码
import stub.*; import javax.xml.namespace.*; import javax.xml.ws.soap.*; import javax.xml.ws.*; import javax.activation.*; import java.net.*; import java.util.*; import java.text.*; import java.io.*; import java.io.IOException; import com.sun.xml.ws.developer.*; /** * @author Hardneedl */ class FileClient { final static private int CHUNK_SIZE = 1024*1024*300; final static private SimpleDateFormat DATEFORMAT = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); public static void main(String[] args) throws MalformedURLException, IOException_Exception { URL url = new URL(args[0]); QName qname = new QName("http://mtom/", "MTOMServerService"); MTOMServerService_Service service = new MTOMServerService_Service(url,qname); MTOMFeature feature = new MTOMFeature(); MTOMServerService mtomPort = service.getMTOMServer(feature); //列文件清单 for(FileDescription fds : mtomPort.listFiles()){ System.out.println("file Name : "+fds.getFileName()); System.out.println("file size : "+fds.getLength()); Date date = fds.getModifiedDate().toGregorianCalendar().getTime(); System.out.println("last date : "+ DATEFORMAT.format(date)); System.out.println("___________________________________________"); } //上载文件 if(args.length<2){ System.err.println("no file to be upload."); System.err.println("set the file path on the command line for the second argument\ne.g\nFileClient [wsdl-url] [full path]"); } else{ Map<String, Object> ctxt = ((BindingProvider)mtomPort).getRequestContext(); ctxt.put(JAXWSProperties.HTTP_CLIENT_STREAMING_CHUNK_SIZE, CHUNK_SIZE); File uploadFile = new File(args[1]); FileDataSource fileDataSource = new FileDataSource(uploadFile); DataHandler dataHandler = new DataHandler(fileDataSource); mtomPort.upload(uploadFile.getName(),dataHandler); } //下载指定的单个文件 //try { // final String fileName = "深海圆疑.rmvb"; // OutputStream fileOut = new FileOutputStream(fileName); // // DataHandler downloadHandler = mtomPort.download(fileName); // InputStream fileIn = downloadHandler.getInputStream(); // byte[] buf = new byte[CHUNK_SIZE]; // int read; // while (-1 != (read = fileIn.read(buf))) { // fileOut.write(buf,0,read); // fileOut.flush(); // } // fileIn.close(); // fileOut.close(); //} catch(FileNotFoundException_Exception e) { // e.printStackTrace(); //} catch(IOException e) { // e.printStackTrace(); //} //下载全部文件 try { List<DataHandler> dataHandlers = mtomPort.downloadMulti(); byte[] buf = new byte[CHUNK_SIZE]; for (int i = 0,j=dataHandlers.size(); i <j;i++) { DataHandler handler = dataHandlers.get(i); String fileName = handler.getName(); fileName = fileName==null||fileName.isEmpty()?Integer.toString(i):fileName; InputStream in = handler.getInputStream(); OutputStream out=new FileOutputStream(fileName); int read; while((read=in.read(buf))!=-1){ out.write(buf,0,read); out.flush(); } in.close();out.close(); } } catch(FileNotFoundException_Exception e) { e.printStackTrace(); } catch(IOException e) { e.printStackTrace(); } } }
评论
发表评论
-
Web Service 的 Provider 服务形式
2016-06-23 12:42 970本文不对jax-ws使用的细节进行讲解(只捞干货),请谅解 ... -
Batik 使用脚本发生未知脚本语言的异常
2007-07-13 17:27 913阅读全文 类别:java应用开发 查看评论 -
JTree 的装饰器演示
2007-04-26 13:08 766阅读全文 类别:java应用开发 查看评论 -
自定义 JTree 的层次
2007-04-26 13:16 775阅读全文 类别:java应用开发 查看评论 -
JComboBox 中带图标的列表项
2007-04-26 13:50 674阅读全文 类别:java应用开发 查看评论 -
用 JSpinner 装裱日期格式的显示与编辑
2007-05-07 19:55 774阅读全文 类别:java应用开发 查看评论 -
把字符串表达的颜色值转换成java.awt.Color 实例
2007-05-12 08:35 3826阅读全文 类别:java应用开发 查看评论 -
良好的习惯――点点滴滴提高程序效能
2007-05-15 14:37 578阅读全文 类别:java应用开发 查看评论 -
良好的习惯――点点滴滴提高程序效能,不要随便创建对象
2007-05-15 14:57 756阅读全文 类别:java应用开发 查看评论 -
Ibatis 2.3 版本上的 sqlMapConfig 配置文件中的路径
2007-06-11 05:24 1343阅读全文 类别:java应用开发 查看评论 -
带行号的 JTable 示意
2007-06-13 03:36 856阅读全文 类别:java应用开发 查看评论 -
带行号 JTable 的功能演示代码
2007-06-13 03:48 1798阅读全文 类别:java应用开发 查看评论 -
Object.equals方法对JTable上JComboBox 的编辑器的影响
2007-06-13 12:41 971阅读全文 类别:java应用开发 查看评论 -
读文本文件 FileChooser, FileFilter 的示例
2007-06-21 15:40 936阅读全文 类别:java应用开发 查看评论 -
用批处理文件打包 Web Start 的发布文件
2007-06-27 16:27 1067阅读全文 类别:java应用开发 查看评论 -
用开源项目前应该好好读读它的文档,仔细考察DEMO的功能
2007-07-01 15:20 904阅读全文 类别:java应用开发 查看评论
相关推荐
Java Web Service 大文件上传下载通常涉及到处理大量数据,尤其是对于超过10MB的大文件,直接使用`byte[]`数组存储并不合适,因为这可能导致内存溢出。在这种情况下,可以利用`DataHandler`类和MTOM(Message ...
本示例着重于CXF客户端如何处理对象参数传递以及支持文件的上传和下载,特别是实现了断点续传功能,这在大文件传输时尤为关键。 【对象传参】: CXF允许通过JAXB(Java Architecture for XML Binding)将Java对象...
在Java开发中,有时我们需要与外部服务进行交互,如发送短信、获取数据等,这时就会用到Web Service。本文将详细介绍如何使用HttpClient和XFire这两种不同的库来调用Web Service,特别是针对短信接口的调用。 首先...
然而,这种方式可能会遇到内存管理和性能问题,因为大文件可能会消耗大量内存。 另一种方法是使用`javax.activation.DataHandler`类。`DataHandler`是Java标准API的一部分,专门用于处理Web服务中的二进制数据。它...
配置文件中包含了服务的Java类路径和其他必要的依赖库,如axis.jar、jaxrpc.jar等,这些库提供了Web Service的实现基础。 在数据持久层,系统选择了Hibernate框架。Hibernate是一个流行的对象关系映射(ORM)工具,...
标题 "DataHandler.rar_axis datahand_web service _webservice" 暗示了这是一个关于使用Axis框架来处理Web服务的项目,其中可能包含了客户端和服务端的数据处理组件。描述中提到的"webservices附件传输"指的是通过...
Axis 是 Apache 组织提供的一款开源的 Web 服务框架,主要用于实现 SOAP 协议下的 Web 服务,它能够帮助开发者快速地开发、部署和调用基于 Java 的 Web 服务。 #### 1.2 Axis 特点 - **简单易用**:Axis 提供了简洁...
对于大文件,可能需要考虑流式传输以减少内存消耗。 3. **使用Spring管理CXF**:通过Spring的`<cxf:bus>`和`<cxf:service>`标签,可以将CXF服务注册到Spring容器中。这样,你可以利用Spring的依赖注入特性,将其他...
### 带附件的Webservice知识点详解 #### 一、Webservice简介与概念 Web服务是一种跨编程语言和操作系统平台的、通过网络提供服务的...这些技术在实际开发中非常有用,尤其是在需要处理大量文件上传下载的应用场景中。
### 使用SAAJ访问Web服务及文件上传的知识点 #### 一、SAAJ概述 SAAJ (SOAP with Attachments API for Java) 是一个重要的Java API,主要用于处理SOAP消息,特别是那些带有附件的消息。它是由JCP (Java Community ...
此外,CXF还支持MTOM(Message Transmission Optimization Mechanism)和SwA(Swapped Attachments)来处理大文件上传和下载。 对于文件上传,CXF提供了`Attachment`接口来处理多部分HTTP请求。以下是一个简单的...
- 处理附件和图片时,可能需要将文件转换为`DataSource`,然后创建`MimeBodyPart`,设置`DataHandler`,并将其添加到邮件消息中。 - 使用`Transport.send()`方法将构建好的邮件消息发送到指定的SMTP服务器。 此外,...
首先,**JAX-WS** 是一种用于构建SOAP(Simple Object Access Protocol)Web服务的标准API,它使得Java开发者可以方便地创建服务端点(SEI,Service Endpoint Interface)并将其暴露为Web服务。JAX-WS通过注解或部署...
8. **Java Authentication and Authorization Service (JAAS)**: `javax.security.auth`和`javax.security.auth.login`包提供了认证和授权服务,用于管理用户身份验证和权限控制。 9. **Java Remote Method ...
JavaEE(Java Platform, Enterprise Edition)是Oracle公司推出的企业级应用开发平台,它提供了一整套框架和服务,用于构建分布式、多层的Web应用程序。JavaEE源码是这个平台背后的核心,包含了各种API和实现,使得...