文档章节

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

DavidBao
 DavidBao
发布于 2015/05/31 21:45
字数 894
阅读 17
收藏 0

本文链接: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注释,运行程序,检查目标文件查看结果。

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






本文转载自:http://blog.csdn.net/kongxx/article/details/7540930

DavidBao
粉丝 113
博文 213
码字总数 126729
作品 0
昌平
私信 提问
Apache CXF 和 Spring 开发 Web Service 1

正文 为什么使用CXF 本文段摘录自 http://www.ibm.com/developerworks/cn/webservices/ws-pojo-springcxf/index.html Apache CXF 是一个开放源代码框架,提供了用于方便地构建和开发 Web 服务...

洋葱94
2015/12/04
265
0
WebServiceCXF与Restful架构风格简介

什么是WebService 简单的说,WebService是一种多系统之间通信的技术. WebService是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML标准来描述、发布、发现、...

稻香今天更新文章了吗
2018/07/01
0
0
根据wsdl 文件 用soapUi 快速创建webService 服务创建(图文并茂)

最近公司业务上使用webservice 频繁。由于之前都是自己搭建webservice 自己定义提供给别人服务,现在则相反需求都是根据人家提供的wsdl 文件来生成 我们平台需要提供的接口。刚开始不知道如何...

hlevel
2014/06/18
13.3K
0
Cxf 集成spring完整示例

1 CXF概述 1.1 CXF介绍 Apache CXF =Celtix + XFire,Apache CXF 的前身叫 Apache CeltiXfire,现在已经正式更名为 Apache CXF 了,以下简称为 CXF。CXF 继承了 Celtix 和 XFire 两大开源项目...

Zero零_度
2015/08/19
99
0
spring+restful service

Spring整合CXF,发布RSETful 风格WebService 这篇文章是承接之前CXF整合Spring的这个项目示例的延伸,所以有很大一部分都是一样的。关于发布CXF WebServer和Spring整合CXF这里就不再多加赘述...

游宵
2014/04/25
1K
1

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
今天
2.3K
15
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
38
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
40
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
61
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
21
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部