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
            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);
    }
}
时间: 2024-10-07 20:58:06

webservice文件上传下载的相关文章

webservice文件上传下载(byte[] 实现方式)

测试环境:axis2-1.6.1.6.0.20.jdk1.5 说明:本方式仅适用于文件小于10M的场景(否则会出现内存溢出),大文件的上传下载应另选其他方式. 1.创建要发布成webservice的java类. import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class BlobService { /* * 文件上传服务 */ public bo

WebService实现文件上传下载

一:服务端:一个普通java web工程 package com.wzh.file; import com.sun.xml.ws.developer.StreamingAttachment; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOExceptio

java web 文件上传下载

文件上传下载案例: 首先是此案例工程的目录结构: 处理上传: FileUploadServlet.java 1 package fnz.fileUploadTest; 2 3 import java.io.File; 4 import java.io.IOException; 5 import java.io.InputStream; 6 import java.io.PrintWriter; 7 import java.text.SimpleDateFormat; 8 import java.

使用Paramiko实现SSH登陆,文件上传下载

1,SSh登陆命令行实现: #!/usr/bin/env python # encoding: utf-8 import paramiko private_key_path = '/Users/aolens/.ssh/id_rsa' key = paramiko.RSAKey.from_private_key_file(private_key_path) ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.Aut

文件上传下载—servlet API实现

servlet API实现文件上传下载需要的jar包: UploadServlet.java package com.ymw.web.servlet; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.List; import java.util.UUID; import javax.servl

文件上传下载

1.文件上传 文件上传下载本质是通过Socket的字节流来传输数据的.所以,对于文件上传,我们可以从HttpRequest对象获取输入流,进而获取上传文件的内容.但是采用ServletAPI并不能获取获取对应文件的字节流,而是获取整个Socket的字节流,里面包括提交的参数.上传文件内容以及其他附加信息. Servlet API上传文件,代码如下 protected void doPost(HttpServletRequest request, HttpServletResponse respo

Hadoop之HDFS原理及文件上传下载源码分析(下)

上篇Hadoop之HDFS原理及文件上传下载源码分析(上)楼主主要介绍了hdfs原理及FileSystem的初始化源码解析, Client如何与NameNode建立RPC通信.本篇将继续介绍hdfs文件上传.下载源解析. 文件上传 先上文件上传的方法调用过程时序图: 其主要执行过程: FileSystem初始化,Client拿到NameNodeRpcServer代理对象,建立与NameNode的RPC通信(楼主上篇已经介绍过了) 调用FileSystem的create()方法,由于实现类为Dis

艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输)(一)

艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输) 该系统基于开源的networkComms通讯框架,此通讯框架以前是收费的,目前已经免费并开元,作者是英国的,开发时间5年多,框架很稳定. 项目地址:http://www.51aspx.com/code/MSDCArtMengFileUpload 咨询qq:286275658 演示程序下载地址:http://pan.baidu.com/s/1geVfmcr 服务器端运行效果图: 服务器端配置文件: <?xml version="1.

开源项目OkHttpPlus——支持GET、POST、UI线程回调、JSON格式解析、链式调用、文件上传下载

OkHttpPlus介绍 项目地址:https://github.com/ZhaoKaiQiang/OkHttpPlus 主要功能:OkHttp封装,支持GET.POST.UI线程回调.JSON格式解析.链式调用.小文件上传下载及进度监听等功能 为什么要写这么一个库呢? 首先,是因为OkHttp在4.4之后已经作为底层的Http实现了,所以OkHttp这个库很强大,值得我们学习. 其次,在我看来,OkHttp使用起来不如Volley方便,OkHttp的回调都是在工作线程,所以如果在回调里面操作V