• webservice文件上传下载


    使用DataHandler实现webservice的文件上传下载

    服务端代码:

    package com.hello.weChat.controller;
    
    import javax.activation.DataHandler;
    import javax.activation.FileDataSource;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    
    /**
     * Created by winkey on 15-2-10.
     */
    public class FileController {
        /*
         * 文件上传服务
         */
        public String upload(DataHandler handler, String fileName) {
            String fullPath = "F:\test\testupload\" + fileName;
            File file = new File(fullPath);
            int flag = 0;
            if (handler == null)
                return "failure";
            if (fileName == null)
                return "failure";
            InputStream input = null;
            FileOutputStream fos = null;
            try {
                input = handler.getInputStream();
                fos = new FileOutputStream(file);
                byte[] buffer = new byte[4096];
                while ((flag = input.read(buffer)) != -1) {
                    fos.write(buffer, 0, flag);
                }
            } catch (IOException e) {
                e.printStackTrace();
                return "failure";
            } finally {
                try {
                    if (input != null) {
                        input.close();
                    }
                    if (fos != null) {
                        fos.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return "Success";
        }
    
        /*
         * 文件下载服务
         */
        public DataHandler downloadFile() {
            String filepath = "F:\test\head.jpg";
            DataHandler dataHandler = new DataHandler(new FileDataSource(filepath));
            System.out.println("-------------------------下载");
            return dataHandler;
        }
    
    
    }

    服务端wsdd文件配置

    <service name="FileController" provider="java:RPC">  
             <parameter name="className" value="com.hello.weChat.controller.FileController"/>  
             <parameter name="allowedMethods" value="downloadFile,upload"/> 
            <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:FileHandler"
                         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>

    下载的时候只需配置typeMapping,上传的时候需要同时配置operation和typeMaping

    客户端:

    下载测试类:

    package com.hello.weChat.controller;
    
    import org.apache.axis.client.Call;
    import org.apache.axis.client.Service;
    import org.apache.axis.encoding.ser.JAFDataHandlerDeserializerFactory;
    import org.apache.axis.encoding.ser.JAFDataHandlerSerializerFactory;
    
    import javax.activation.DataHandler;
    import javax.xml.namespace.QName;
    import javax.xml.rpc.ServiceException;
    import java.io.*;
    import java.rmi.RemoteException;
    
    /**
     * Created by winkey on 15-2-10.
     */
    public class downloadTest {
        public static void main(String[] args) {   // TODO Auto-generated method stub
            String url = "http://192.168.129.245:8080/btm-szny/services/FileController";
            Service service = new Service();
            Call call;
            DataHandler handler;
            InputStream input = null;
            FileOutputStream fos = null;
            String filepath = "f:/test/";
            String filename = filepath + "tests.jpg";
            File file = new File(filename);
            try {
                call = (Call) service.createCall();
                /**
                 *
                 * 注册异常类信息和序列化类
                 * ns:FileHandler 和 wsdd 配置文件中的typeMapping中的xmlns:hns="ns:FileHandler" 的对应
                 * DataHandler和 wsdd 配置文件中的typeMapping中的qname="hns:DataHandler"的DataHandler对应
                 *
                 */
                QName qn = new QName("ns:FileHandler", "DataHandler");
                call.setTargetEndpointAddress(url);
                call.setOperationName(new QName("FileController", "downloadFile"));
                call.registerTypeMapping(DataHandler.class, qn, JAFDataHandlerSerializerFactory.class, JAFDataHandlerDeserializerFactory.class); 
           //设置入参名字 //call.addParameter("source", XMLType.XSD_STRING ,ParameterMode.IN); //设置服务调用方法的传入参数类型 call.setReturnType(qn, DataHandler.class);//需要返回的QName以及返回的类型是DataHandler.class
           //设置入参的值,放到object数组中
    handler = (DataHandler) call.invoke(new Object[]{}); input = handler.getInputStream(); fos = new FileOutputStream(file); byte[] buffer = new byte[1024]; while (input.read(buffer) != -1) { fos.write(buffer); } } catch (ServiceException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { if (input != null) { try { input.close(); } catch (Exception e2) { // TODO: handle exception } } if (fos != null) { try { fos.close(); } catch (Exception e2) { // TODO: handle exception } } } } }

    上传测试类:

    package com.hello.weChat.controller;
    
    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;
    
    /**
     * Created by winkey on 15-2-10.
     */
    public class uploadTest {
        public static void main(String[] args) throws ServiceException, RemoteException {
            String url = "http://192.168.129.245:8080/btm-szny/services/FileController";
            String fileName = "head.jpg";
            String path = "f:/test/" + 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:FileHandler", "DataHandler");
            call.registerTypeMapping(DataHandler.class, qn,
                    JAFDataHandlerSerializerFactory.class,
                    JAFDataHandlerDeserializerFactory.class);
            call.setOperationName(new QName(url, "upload"));
    
            //设置方法形参,注意的是参数1的type的DataHandler类型的,和上面的qn的类型是一样的
            call.addParameter("dataHandler", 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_head.jpg" });
            System.out.println(result);
        }
    }
  • 相关阅读:
    第二节:Java环境变量配置
    第一节:VS充当IIS的配置步骤(VS2017和VS2019)
    .Net进阶系列(21)-跨域请求
    02-Unity深入浅出(二)
    第十五节:Expression表达式目录树(与委托的区别、自行拼接、总结几类实例间的拷贝)
    01-Unity深入浅出(一)
    第十二节:SQLServer存储过程详解及EFCore调用
    Android 组件系列-----Activity的传值和回传值
    Access大数据高效分页语句
    C#清除HTML样式
  • 原文地址:https://www.cnblogs.com/winkey4986/p/4284412.html
Copyright © 2020-2023  润新知