• 九、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了.

  • 作者:hoojo
    出处:
    blog:http://blog.csdn.net/IBM_hoojo
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权所有,转载请注明出处 本文出自:
分享道版权所有,欢迎转载,转载请注明出处,谢谢
收藏
关注
评论
  • 相关阅读:
    Sql日期时间格式转换;取年 月 日,函数:DateName()、DATEPART()
    @@ROWCOUNT (Transact-SQL)
    C#调用存储过程简单完整例子
    C# Ajax 手机发送短信验证码 校验验证码 菜鸟级别实现方法
    C#反射技术的简单操作(读取和设置类的属性)
    .NET调用Java写的WebService
    蓝牙错误提示
    sql开启xp_cmdshell
    网页手机宽度
    对称加密算法比较
  • 原文地址:https://www.cnblogs.com/hoojo/p/1911385.html
  • Copyright © 2020-2023  润新知