Web Service传输文件

文章摘抄至 http://blog.csdn.net/kongxx/article/details/7540930

1. 首先是一个封装了服务器端文件路径,客户端文件路径和要传输的字节数组的MyFile类。

package file.model;

public class MyFile {  
    
    private String clientFile;  
      
    private String serverFile;  
      
    private long position;  
      
    private byte[] bytes;  
  
    public String getClientFile() {  
        return clientFile;  
    }  
  
    public void setClientFile(String clientFile) {  
        this.clientFile = clientFile;  
    }  
  
    public String getServerFile() {  
        return serverFile;  
    }  
  
    public void setServerFile(String serverFile) {  
        this.serverFile = serverFile;  
    }  
  
    public long getPosition() {  
        return position;  
    }  
  
    public void setPosition(long position) {  
        this.position = position;  
    }  
  
    public byte[] getBytes() {  
        return bytes;  
    }  
  
    public void setBytes(byte[] bytes) {  
        this.bytes = bytes;  
    }  
}  

2. 文件传输的Web Service接口

package file.service;

import javax.jws.WebMethod;  
import javax.jws.WebService;  

import file.model.MyFile;
  
@WebService  
public interface FileTransferService {  
      
    @WebMethod
    void uploadFile(MyFile myFile) throws FileTransferException;  

    @WebMethod
    MyFile downloadFile(MyFile myFile) throws FileTransferException;  
}  

3. 文件传输的Web Service接口实现类,主要是一些流的操作

package file.service;

import java.io.File;  
import java.io.FileInputStream;  
import java.io.IOException;  
import java.io.InputStream;  
import java.io.OutputStream;  
import java.util.Arrays;  
  
import org.apache.commons.io.FileUtils;  
import org.apache.commons.io.IOUtils;  

import file.model.MyFile;
  
public class FileTransferServiceImpl implements FileTransferService {  
  
    public void uploadFile(MyFile myFile) throws FileTransferException {  
        OutputStream os = null;  
          
        try {  
        	if (myFile.getPosition() != 0) {  
                os = FileUtils.openOutputStream(new File(myFile.getServerFile()));  
            } else {  
                os = FileUtils.openOutputStream(new File(myFile.getServerFile()));  
            }  
            os.write(myFile.getBytes());  
        } catch(IOException e) {  
            throw new FileTransferException(e.getMessage(), e);  
        } finally {  
            IOUtils.closeQuietly(os);  
        }  
    }  
  
    public MyFile downloadFile(MyFile myFile) throws FileTransferException {  
        InputStream is = null;  
          
        try {  
            is = new FileInputStream(myFile.getServerFile());  
            is.skip(myFile.getPosition());  
            byte[] bytes = new byte[1024 * 1024];  
            int size = is.read(bytes);  
            if (size > 0) {  
                byte[] fixedBytes = Arrays.copyOfRange(bytes, 0, size);  
                myFile.setBytes(fixedBytes);  
            } else {  
                myFile.setBytes(new byte[0]);  
            }  
        } catch(IOException e) {  
            throw new FileTransferException(e.getMessage(), e);  
        } finally {  
            IOUtils.closeQuietly(is);  
        }  
        return myFile;  
    }  
}

4. 一个简单的文件传输异常类

package file.service;
public class FileTransferException extends Exception {  
	  
    private static final long serialVersionUID = 1L;  
  
    public FileTransferException() {  
        super();  
    }  
  
    public FileTransferException(String message, Throwable cause) {  
        super(message, cause);  
    }  
  
    public FileTransferException(String message) {  
        super(message);  
    }  
  
    public FileTransferException(Throwable cause) {  
        super(cause);  
    }  
}  

5. 下面是Server类用来发布web service

package file.deploy;

import javax.xml.ws.Endpoint;

import file.service.FileTransferServiceImpl;

public class FileTransferServer {  
    
    public static void main(String[] args) throws Exception {  
        Endpoint.publish("http://localhost:9000/ws/jaxws/fileTransferService", new FileTransferServiceImpl());  
    }  
}  

6. 最后是Client类,用来发送文件上传和下载请求。

package file.client;

import java.io.File;  
import java.io.FileInputStream;  
import java.io.IOException;  
import java.io.InputStream;  
import java.io.OutputStream;  
import java.util.Arrays;  
  
import org.apache.commons.io.FileUtils;  
import org.apache.commons.io.IOUtils;  
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;  

import file.model.MyFile;
import file.service.FileTransferException;
import file.service.FileTransferService;
  
public class FileTransferClient {  
      
    private static final String address = "http://localhost:9000/ws/jaxws/fileTransferService";  
      
    private static final String clientFile = "c:/client/a.xml";  
    private static final String serverFile = "c:/server/b.xml";  
      
    public static void main(String[] args) throws Exception {  
        long start = System.currentTimeMillis();  
//      uploadFile();  
      downloadFile();  
        long stop = System.currentTimeMillis();  
        System.out.println("Time: " + (stop - start));  
    }  
      
    private static void uploadFile() throws FileTransferException {  
        InputStream is = null;  
        try {  
            MyFile myFile = new MyFile();  
            is = new FileInputStream(clientFile);  
            byte[] bytes = new byte[1024 * 1024];  
            while (true) {  
                int size = is.read(bytes);  
                if (size <= 0) {  
                    break;  
                }  
                  
                byte[] fixedBytes = Arrays.copyOfRange(bytes, 0, size);  
                myFile.setClientFile(clientFile);  
                myFile.setServerFile(serverFile);  
                myFile.setBytes(fixedBytes);  
                  
                uploadFile(myFile);  
                  
                myFile.setPosition(myFile.getPosition() + fixedBytes.length);  
            }  
        } catch(IOException e) {  
            throw new FileTransferException(e.getMessage(), e);  
        } finally {  
            IOUtils.closeQuietly(is);  
        }  
    }  
      
    private static void uploadFile(MyFile myFile) throws FileTransferException {  
        JaxWsProxyFactoryBean factoryBean = new JaxWsProxyFactoryBean();  
        factoryBean.setAddress(address);  
        factoryBean.setServiceClass(FileTransferService.class);  
        Object obj = factoryBean.create();  
  
        FileTransferService service = (FileTransferService) obj;  
        service.uploadFile(myFile);  
    }  
      
    private static void downloadFile() throws FileTransferException {  
        MyFile myFile = new MyFile();  
        myFile.setServerFile(serverFile);  
        long position = 0;  
        while (true) {  
            myFile.setPosition(position);  
            myFile = downloadFile(myFile);  
            if (myFile.getBytes().length <= 0) {  
                break;  
            }  
              
            OutputStream os = null;  
            try {  
                if (position != 0) {  
                    os = FileUtils.openOutputStream(new File(clientFile));  
                } else {  
                    os = FileUtils.openOutputStream(new File(clientFile));  
                }  
                os.write(myFile.getBytes());  
            } catch(IOException e) {  
                throw new FileTransferException(e.getMessage(), e);  
            } finally {  
                IOUtils.closeQuietly(os);  
            }  
              
            position += myFile.getBytes().length;  
        }  
    }  
      
    private static MyFile downloadFile(MyFile myFile) throws FileTransferException {  
        JaxWsProxyFactoryBean factoryBean = new JaxWsProxyFactoryBean();  
        factoryBean.setAddress(address);  
        factoryBean.setServiceClass(FileTransferService.class);  
        Object obj = factoryBean.create();  
  
        FileTransferService service = (FileTransferService) obj;  
        return service.downloadFile(myFile);  
    }  
}  

首先需要准备一个大一点的文件,然后修改代码中的clientFile和serverFile路径,然后分别打开uploadFile和downloadFile注释,运行程序,检查目标文件查看结果。

这个程序还是比较简单的,但基本生完成了文件上传下载功能,如果需要,也可以对这个程序再做点修改使其支持断点续传。

猜你喜欢

转载自hbiao68.iteye.com/blog/2044258