WebService中文件传输

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

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了.

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/451112.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Django框架-Form组件

一、DjangoForm组件介绍 我们之前在html页面中利用form表单向后端提交数据时&#xff0c;都会写一些获取用户输入的标签并且用form标签把它们包起来。 与此同时我们在好多场景下都需要对用户的输入做校验&#xff0c;比如验证用户是否输入&#xff0c;输入的长度和格式等是否正…

中国经济转型知易行难

摘要&#xff1a;一个亚洲国家正在崛起&#xff0c;出口机器势不可挡&#xff0c;财富快速增长&#xff0c;觉得美国已是过去&#xff0c;自己的时代已经到来。这是2012年的中国&#xff1f;没错———但也是上世纪80年代的日本。 美国《芝加哥论坛报》网站5月20日文章&#xf…

进程和线程的剖析

进程和线程的区别&#xff1f;什么时候用进程&#xff1f;什么时候用线程&#xff1f; 答&#xff1a;首先得知道什么是进程什么是线程&#xff1f; 我的理解是进程是指在系统中正在运行的一个应用程序&#xff1b;程序一旦运行就是进程&#xff0c;或者更专业化来说&#xff1…

解决 java.net.ConnectException: Connection refused: connect 异常

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 一、 我的情况很简单&#xff1a; 只是因为我调用服务端接口方法包名没有写对&#xff0c;应该如下面代码中这样写&#xff1a; call.…

主席树的各类模板(区间第k大数【动,静】,区间不同数的个数,区间=k的个数)...

取板粗 好东西来的 1.&#xff08;HDOJ2665&#xff09;http://acm.hdu.edu.cn/showproblem.php?pid2665 &#xff08;POJ2104&#xff09;http://poj.org/problem?id2104 &#xff08;POJ2761&#xff09;http://poj.org/problem?id2761 题意&#xff1a;求区间第K大&…

java类内部的变量

类内部的变量分为两部分&#xff1a; 一.类的成员变量 在类内部&#xff0c;变量定义部分&#xff0c;定义的变量。 二.局部变量 在类内方法体中定义的变量和方法中涉及的变量。 成员变量和局部变量的区别&#xff1a; &#xff08;1&#xff09;成员变量在整个类中都有效…

腾讯搜搜退出PC搜索领域:百度搜狗迎来双龙竞争

摘要&#xff1a;据北京商报报道&#xff0c;上周末&#xff0c;腾讯对公司组织架构进行了大规模调整。业内普遍认为&#xff0c;搜搜并入腾讯无线后&#xff0c;这个独立搜索平台将被合并&#xff0c;失去独立性&#xff0c;也将令搜搜官网域名soso.com走向“没落”。据北京商…

facade-pattern外观模式

外观模式&#xff1a; 外观模式是面向对象编程中的重要设计模式。外观类用来掩盖复杂的内部逻辑&#xff0c;为用户提供简洁统一的服务接口。外观类的主要功能如下&#xff1a; 1.通过提供简明的对外API接口&#xff0c;来提高程序的可阅读性和间接性。 2.提供通用的特定功能…

Web Service 客户端,调用服务方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 只是最简单的调用web service 服务&#xff0c;至于要传什么参数全看到业务了。 以下是最简单的调用方式 &#xff1a; package hdmp…

分享Spring Cloud分布式微服务架构图

分布式、微服务、云架构JAVA语言开发、跨平台、高性能、高可用、安全、服务化、模块化、组件化、驱动式开发模式 从现在开始&#xff0c;我这边会将近期研发的springcloud微服务云架构的搭建过程和精髓记录下来&#xff0c;帮助更多有兴趣研发spring cloud框架的朋友&#xff0…

返回一个list的全部 倒叙排列的方法

#反向迭代一个listlist[2,4,6,4,3,7,5,45,23,6,5,32,6,52,324,23,65,76,3,234,6,3,4,356,7,74,234,35,7,86]def funrev(list): list1[] for i in range(len(list)): list1.append(list[-i-1]) print(list1) return list1print(************************)lis…

互联网手机潮进入PK时代:周鸿祎激战小米雷军

摘要&#xff1a;事实上&#xff0c;周鸿祎本人也多次强调&#xff0c;对于对手他一向实事求是&#xff0c;“对小米手机这种模式持肯定态度&#xff0c;它是第一个做互联网手机的”。花费精力做出漂亮的销售业绩&#xff0c;这是互联网手机最关键命题&#xff0c;配置战、价格…

很多人问为什么使用联合索引,为什么不建两个单独的索引呢?

So why not just create two indexes, one on last_name and one on first_name? You could do that, but MySQL won’t use them both at the same time. In fact, MySQL will only ever use one index per table per query—except for UNIONs.[3] This fact is important e…

oracle表被锁了怎么处理

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 首先你要知道表锁住了是不是正常锁&#xff1f;因为任何DML语句都会对表加锁。你要先查一下是那个会话那个sql锁住了表&#xff0c;有可…

Lyft Level 5 Challenge 2018 - Elimination Round翻车记

打猝死场感觉非常作死。 A&#xff1a;判一下起点和终点是否在其两侧即可。 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; int read() {int x0,…

mysql用户的权限分配

2019独角兽企业重金招聘Python工程师标准>>> 因今天在分配数据库权限的时候&#xff0c;同事反映账户不能使用函数&#xff0c;遂搜集资料总结了一番关于mysql用户的权限分配。 MySQL 赋予用户权限命令的简单格式可概括为&#xff1a; grant 权限 on 数据库对象 to …

小米360口水战背后:国产手机第三态诞生

摘要&#xff1a;按照双方公布的配置信息&#xff0c;小米手机青春版为1.2G H z双核处理器&#xff0c;华为闪耀为1G H z双核。种向市场投入海量推广资金&#xff0c;以换取产品上的高利润&#xff0c;代表为步步高、金立、O PPO。南都制图&#xff1a;宋小伟 互联网入侵通信业…

java bean转map

一.使用Apache提供的BeanUtils public Map test(Object person) {Map map BeanUtils.describe(person);return map; } 二.使用Jackson public Map test(Object person) {ObjectMapper objectMapper new ObjectMapper(); Map map objectMapper.convertValue(person, HashM…

java中ftp文件上传和中文乱码解决

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 前几天 有个需求就是上传文件的时候&#xff0c;本地存一份&#xff0c;其他服务器也保存一份&#xff0c;于是就研究了一下&#xff0c…

线段与多边形的关系

转自周见智 介绍 最近项目中要用到有关几何&#xff08;Geometry&#xff09;方面的知识&#xff0c;程序需要判断给定的一条线段&#xff08;Segment&#xff09;与指定多边形&#xff08;Polygon&#xff09;的位置关系。这种关系分为三种&#xff1a;多边形包含线段、多边形…