前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。

WebService处理传递普通的信息,还可以传输文件,下面介绍WebService是怎么完成文件传输的。

1、 首先编写服务器端上传文件的WebService方法

package com.hoo.service; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.InputStream; import javax.activation.DataHandler; /** * <b>function:</b>Axis WebService完成文件上传服务器端 * @author hoojo * @createDate Dec 18, 2010 1:16:16 PM * @file UploadFileService.java * @package com.hoo.service * @project AxisWebService * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */ public class UploadFileService { /** * <b>function:</b>传递文件 * @author hoojo * @createDate Dec 18, 2010 1:27:58 PM * @param handler DataHandler这个参数必须 * @param fileName 文件名称 * @return upload Info */ public String upload(DataHandler handler, String fileName) { if (fileName != null && !"".equals(fileName)) { File file = new File(fileName); if (handler != null) { InputStream is = null; FileOutputStream fos = null; try { is = handler.getInputStream(); fos = new FileOutputStream(file); byte[] buff = new byte[1024 * 8]; int len = 0; while ((len = is.read(buff)) > 0) { fos.write(buff, 0, len); } } catch(FileNotFoundException e) { return "fileNotFound"; } catch (Exception e) { return "upload File failure"; } finally { try { if (fos != null) { fos.flush(); fos.close(); } if (is != null) { is.close(); } } catch (Exception e) { e.printStackTrace(); } } return "file absolute path:" + file.getAbsolutePath(); } else { return "handler is null"; } } else { return "fileName is null"; } } }

上传方法和我们以前在Web中上传唯一不同的就是参数一DataHandler,可以将这类看成文件传输器,他可以把文件序列化。然后通过DataHandler可以得到一个输入流InputStream,通过这个流可以读到文件的内容。其他的操作和普通上传类似。

2、 定制wsdd发布文件上传的WebService服务

<?xml version="1.0" encoding="UTF-8"?> <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <service name="UploadFile" provider="java:RPC"> <parameter name="className" value="com.hoo.service.UploadFileService" /> <parameter name="allowedMethods" value="*" /> <parameter name="scope" value="Session" /> <!-- 和服务器端上传文件的方法签名对应,参数也对应 --> <operation name="upload" qname="operNS:upload" xmlns:operNS="upload" returnType="rns:string" xmlns:rns="http://www.w3.org/2001/XMLSchema"> <parameter name="handler" type="ns:DataHandler" xmlns:ns="http://www.w3.org/2001/XMLSchema"/> <parameter name="fileName" type="ns:string" xmlns:ns="http://www.w3.org/2001/XMLSchema"/> </operation> <typeMapping qname="hns:DataHandler" xmlns:hns="ns:FileUploadHandler" languageSpecificType="java:javax.activation.DataHandler" serializer="org.apache.axis.encoding.ser.JAFDataHandlerSerializerFactory" deserializer="org.apache.axis.encoding.ser.JAFDataHandlerDeserializerFactory" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> </service> </deployment>

上面才xml节点元素在前面都见过了,说明下operation中的参数,注意要指定参数类型,特别是DataHandler的类型,然后就是typeMapping的serializer、deserializer的序列化和反序列化工厂类的配置。

3、 用dos命令发布当前WebService

C:\SoftWare\tomcat-5.0.28\tomcat-5.0.28\webapps\AxisWebService\WEB-INF>java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -lhttp://localhost:8080/AxisWebService/services/AdminService deployUpload.wsdd

发布完成后,可以通过这个地址查看uploadFile这个service了

http://localhost:8080/AxisWebService/servlet/AxisServlet

4、 编写客户端代码

package com.hoo.client; import java.rmi.RemoteException; import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.xml.namespace.QName; import javax.xml.rpc.ParameterMode; import javax.xml.rpc.ServiceException; import org.apache.axis.client.Call; import org.apache.axis.client.Service; import org.apache.axis.encoding.XMLType; import org.apache.axis.encoding.ser.JAFDataHandlerDeserializerFactory; import org.apache.axis.encoding.ser.JAFDataHandlerSerializerFactory; /** * <b>function:</b>上传文件WebService客户端 * * @author hoojo * @createDate Dec 18, 2010 1:38:14 PM * @file UploadFileClient.java * @package com.hoo.client * @project AxisWebService * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */ public class UploadFileClient { public static void main(String[] args) throws ServiceException, RemoteException { String url = "http://localhost:8080/AxisWebService/services/UploadFile"; String fileName = "readMe.txt"; String path = System.getProperty("user.dir") + "\\WebRoot\\" + fileName; System.out.println(path); //这样就相当于构造了一个带文件路径的File了 DataHandler handler = new DataHandler(new FileDataSource(path)); Service service = new Service(); Call call = (Call) service.createCall(); call.setTargetEndpointAddress(url); /** * 注册异常类信息和序列化类 ns:FileUploadHandler 和 wsdd 配置文件中的typeMapping中的xmlns:hns="ns:FileUploadHandler" 的对应 DataHandler * 和 wsdd 配置文件中的typeMapping中的qname="hns:DataHandler"的DataHandler对应 */ QName qn = new QName("ns:FileUploadHandler", "DataHandler"); call.registerTypeMapping(DataHandler.class, qn, JAFDataHandlerSerializerFactory.class, JAFDataHandlerDeserializerFactory.class); call.setOperationName(new QName(url, "upload")); //设置方法形参,注意的是参数1的type的DataHandler类型的,和上面的qn的类型是一样的 call.addParameter("handler", qn, ParameterMode.IN); call.addParameter("fileName", XMLType.XSD_STRING, ParameterMode.IN); //设置返回值类型,下面2种方法都可以 call.setReturnClass(String.class); //call.setReturnType(XMLType.XSD_STRING); String result = (String) call.invoke(new Object[] { handler, "remote_server_readMe.txt" }); System.out.println(result); } }

至此,文件传输就完成了。怎么样,还不错吧!

如果你用myEclipse进行开发的话,运行时可能会出现以下的错误:

Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream

原因是jar包版本不统一,解决方法如下:

删除Java EE 5 Libraries/javaee.jar/mail里的包有东西.

具体方法如下:

用rar打开X:/Program Files/MyEclipse 6.0/myeclipse/eclipse/plugins/com.genuitec.eclipse.j2eedt.core_6.0.1.zmyeclipse601200710/data/libraryset/EE_5/javaee.jar,然后删除mail,一切就ok了.

WebService中文件传输相关推荐

  1. 九、WebService中文件传输

    WebService处理传递普通的信息,还可以传输文件,下面介绍WebService是怎么完成文件传输的. 1. 首先编写服务器端上传文件的WebService方法 代码 上传方法和我们以前在Web中 ...

  2. webservice大文件传输

    来自: http://blog.sina.com.cn/s/blog_5245a6580100vw5r.html 和   http://blog.sina.com.cn/s/blog_5245a658 ...

  3. 关于TCP中文件传输阻塞问题的原因及解决方案和相关优化。

    **## 在自学java过程中遇到的一些问题** 对于如图所示--文件传输示例:由客户端读取本机文件并上传至服务器,服务器进行读取后保存到服务器硬盘上. 但此过程中易出现阻塞问题,即客户端和服务器端在 ...

  4. Linux中文件传输方式

    TFTP : FTP是文件服务器,可实现将文件上传至远程服务器,也可以从服务器下载文件到本地主机. scp: scp能够将不同主机的文件进行相互传输,使用简单方便. rz : 用于linux与wind ...

  5. sendfile | 传说中的零拷贝(主要用于网络中文件传输)

    sendfile函数 sendfile函数简介 sendfile简单小例子 用sendfile函数简单模拟文件下载 sendfile函数简介 sendfile函数:sendfile函数是在两个文件描述 ...

  6. P2P(BT)中文件传输、分片

    文件分片与节点选择 分片机制. BitTorrent像其他文件共享软件一样对文件进行了分片(Piece),Piece是最小的文件共享单位,每个Leecher在下载完一个完整的分片后才会进行完整性校验, ...

  7. 解决前后端分离中文件传输跨域失败问题

    笔者在之前的开发中就遇到过这种情况:给与后端的文件下载接口,我在浏览器在postman上试过都是可以的,但在前端上就报这种错误: 看上面的介绍是说前后端跨域问题,可是后端代码中明明配置了放行所有请求, ...

  8. Linux中文件传输、解压缩文件

    第一次在服务器上部署项目文件,谨慎慢又慢,搜了那么多命令也是瞎,直接简单上手得多舒服 1.上传本地文件到linux,linux下载文件到本地命令 1)sz命令发送文件到本地:[ ]# sz filen ...

  9. 文件服务器恢复测试,基于文件传输中文件损坏检测和恢复办法.doc

    基于文件传输中文件损坏检测和恢复办法 基于文件传输中文件损坏检测和恢复办法 摘 要:在网络上文件传输是一种常见的应用,讨论在文件传输完成后检测错误和恢复数据的办法. 关键词:文件传输;文件校验;恢复 ...

最新文章

  1. event对象获取方法
  2. 使用默认Model Binding支持集合类
  3. 将英文的week 转换为中文的 简单的方法
  4. swagger: fetching resource list: http://localhost:8080/template/v2/api-docs?group=springboot-templat
  5. mysql分頁查詢_mysql分頁查詢 | 學步園
  6. java filter 不过滤器_Java中的Filter过滤器
  7. QT绘图底层是如何适配各种操作系统的
  8. 玩转华为ENSP模拟器系列 | 合集
  9. win7计算机闪屏,win7电脑闪屏是什么原因
  10. ThinkPHP教程
  11. Unable to find image ‘yt:latest‘ locally
  12. java异常的使用(摆脱唯唯诺诺之“干了再说”)
  13. 文件名依照字符串和数字进行排序
  14. mysql 按照中文拼音首字母排序
  15. Solidity Integer Overflow and Underflow
  16. 一顿操作猛如虎,3000 行代码重构成 15 !
  17. 红绿灯交通灯控制逻辑电路设计
  18. 安卓实现下拉刷新上拉加载
  19. html div背景图片路径,css如何设置背景图片位置?
  20. 什么是DTS?什么是快乐星球?

热门文章

  1. PWN-PRACTICE-BUUCTF-25
  2. 【Python学习】 - pyecharts包 - 地图可视化
  3. 【HDU - 6118】度度熊的交易计划(最小费用可行流,网络流费用流变形 )
  4. 【Hihocoder - offer编程练习赛93 套题题解】交错01串(贪心,暴力)方格矩阵高度(模拟)数对(STLmultiset)修整土地(网络流)
  5. 使用PDF.js实现前端和手机端网页预览PDF文件(可定制,支持本地文件、Base64编码和远程URL跨域方式)
  6. android布局属性,Android 布局学习之——LinearLayout属性baselineAligned的作用及baseline...
  7. python 升级所有库_自动更新Python所有第三方库
  8. 阿里mysql 二进制_Mysql binlog 之阿里canal
  9. python缺少标准库_Python 实现自动导入缺失的库
  10. leetcode203 移除链表元素