现在的位置: 首页 > 综合 > 正文

Apache CXF实战之七 使用Web Service传输文件

2013年07月09日 ⁄ 综合 ⁄ 共 5902字 ⁄ 字号 评论关闭

本文链接:http://blog.csdn.net/kongxx/article/details/7540930

Apache CXF实战之一 Hello World Web Service

Apache CXF实战之二 集成Sping与Web容器

Apache CXF实战之三 传输Java对象

Apache CXF实战之四 构建RESTful Web Service

Apache CXF实战之五 压缩Web Service数据

Apache CXF实战之六 创建安全的Web Service

首先声明我知道有个协议叫ftp,也知道有种编程叫sock编程,但我就是碰到了server对外只开放80端口,并且还需要提供文件上传和下载功能的应用,那好吧,开始干活。

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

package com.googlecode.garbagecan.cxfstudy.filetransfer;


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 com.googlecode.garbagecan.cxfstudy.filetransfer;

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

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

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

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

package com.googlecode.garbagecan.cxfstudy.filetransfer;

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;

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()), true);
            } else {
                os = FileUtils.openOutputStream(new File(myFile.getServerFile()), false);
            }
            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 com.googlecode.garbagecan.cxfstudy.filetransfer;

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 com.googlecode.garbagecan.cxfstudy.filetransfer;

import javax.xml.ws.Endpoint;

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

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

package com.googlecode.garbagecan.cxfstudy.filetransfer;

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;

public class FileTransferClient {
    
    private static final String address = "http://localhost:9000/ws/jaxws/fileTransferService";
    
    private static final String clientFile = "/home/fkong/temp/client/test.zip";
    private static final String serverFile = "/home/fkong/temp/server/test.zip";
    
    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), true);
                } else {
                    os = FileUtils.openOutputStream(new File(clientFile), false);
                }
                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注释,运行程序,检查目标文件查看结果。

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

抱歉!评论已关闭.