Apache CXF实战之七:使用Web Service传输文件
首先声明我知道有个协议叫ftp,也知道有种编程叫sock编程,但我就是碰到了server对外只开放80端口,并且还需要提供文件上传和下载功能的应用,那好吧,开始干活。
1. 首先是一个封装了服务器端文件路径,客户端文件路径和要传输的字节数组的MyFile类。
[*]packagecom.googlecode.garbagecan.cxfstudy.filetransfer;
[*]
[*]
[*]
publicclassMyFile{
[*]
[*]
privateStringclientFile;
[*]
[*]
privateStringserverFile;
[*]
[*]
privatelongposition;
[*]
[*]
privatebyte[]bytes;
[*]
[*]
publicStringgetClientFile(){
[*]
returnclientFile;
[*]}
[*]
[*]
publicvoidsetClientFile(StringclientFile){
[*]
this.clientFile=clientFile;
[*]}
[*]
[*]
publicStringgetServerFile(){
[*]
returnserverFile;
[*]}
[*]
[*]
publicvoidsetServerFile(StringserverFile){
[*]
this.serverFile=serverFile;
[*]}
[*]
[*]
publiclonggetPosition(){
[*]
returnposition;
[*]}
[*]
[*]
publicvoidsetPosition(longposition){
[*]
this.position=position;
[*]}
[*]
[*]
publicbyte[]getBytes(){
[*]
returnbytes;
[*]}
[*]
[*]
publicvoidsetBytes(byte[]bytes){
[*]
this.bytes=bytes;
[*]}
[*]}
2. 文件传输的Web Service接口
[*]packagecom.googlecode.garbagecan.cxfstudy.filetransfer;
[*]
[*]
importjavax.jws.WebMethod;
[*]
importjavax.jws.WebService;
[*]
[*]
@WebService
[*]
publicinterfaceFileTransferService{
[*]
[*]
@WebMethod
[*]
voiduploadFile(MyFilemyFile)throwsFileTransferException;
[*]
[*]
@WebMethod
[*]
MyFiledownloadFile(MyFilemyFile)throwsFileTransferException;
[*]}
3. 文件传输的Web Service接口实现类,主要是一些流的操作
[*]packagecom.googlecode.garbagecan.cxfstudy.filetransfer;
[*]
[*]
importjava.io.File;
[*]
importjava.io.FileInputStream;
[*]
importjava.io.IOException;
[*]
importjava.io.InputStream;
[*]
importjava.io.OutputStream;
[*]
importjava.util.Arrays;
[*]
[*]
importorg.apache.commons.io.FileUtils;
[*]
importorg.apache.commons.io.IOUtils;
[*]
[*]
publicclassFileTransferServiceImplimplementsFileTransferService{
[*]
[*]
publicvoiduploadFile(MyFilemyFile)throwsFileTransferException{
[*]
OutputStreamos=null;
[*]
[*]
try{
[*]
if(myFile.getPosition()!=0){
[*]
os=FileUtils.openOutputStream(newFile(myFile.getServerFile()),true);
[*]
}else{
[*]
os=FileUtils.openOutputStream(newFile(myFile.getServerFile()),false);
[*]}
[*]os.write(myFile.getBytes());
[*]
}catch(IOExceptione){
[*]
thrownewFileTransferException(e.getMessage(),e);
[*]
}finally{
[*]IOUtils.closeQuietly(os);
[*]}
[*]}
[*]
[*]
publicMyFiledownloadFile(MyFilemyFile)throwsFileTransferException{
[*]
InputStreamis=null;
[*]
[*]
try{
[*]
is=newFileInputStream(myFile.getServerFile());
[*]is.skip(myFile.getPosition());
[*]
byte[]bytes=newbyte[1024*1024];
[*]
intsize=is.read(bytes);
[*]
if(size>0){
[*]
byte[]fixedBytes=Arrays.copyOfRange(bytes,0,size);
[*]myFile.setBytes(fixedBytes);
[*]
}else{
[*]
myFile.setBytes(newbyte[0]);
[*]}
[*]
}catch(IOExceptione){
[*]
thrownewFileTransferException(e.getMessage(),e);
[*]
}finally{
[*]IOUtils.closeQuietly(is);
[*]}
[*]
returnmyFile;
[*]}
[*]}
4. 一个简单的文件传输异常类
[*]packagecom.googlecode.garbagecan.cxfstudy.filetransfer;
[*]
[*]
publicclassFileTransferExceptionextendsException{
[*]
[*]
privatestaticfinallongserialVersionUID=1L;
[*]
[*]
publicFileTransferException(){
[*]
super();
[*]}
[*]
[*]
publicFileTransferException(Stringmessage,Throwablecause){
[*]
super(message,cause);
[*]}
[*]
[*]
publicFileTransferException(Stringmessage){
[*]
super(message);
[*]}
[*]
[*]
publicFileTransferException(Throwablecause){
[*]
super(cause);
[*]}
[*]}
5. 下面是Server类用来发布web service
[*]packagecom.googlecode.garbagecan.cxfstudy.filetransfer;
[*]
[*]
importjavax.xml.ws.Endpoint;
[*]
[*]
publicclassFileTransferServer{
[*]
[*]
publicstaticvoidmain(String[]args)throwsException{
[*]
Endpoint.publish("http://localhost:9000/ws/jaxws/fileTransferService",newFileTransferServiceImpl());
[*]}
[*]}
6. 最后是Client类,用来发送文件上传和下载请求。
[*]packagecom.googlecode.garbagecan.cxfstudy.filetransfer;
[*]
[*]importjava.io.File;
[*]importjava.io.FileInputStream;
[*]importjava.io.IOException;
[*]importjava.io.InputStream;
[*]importjava.io.OutputStream;
[*]importjava.util.Arrays;
[*]
[*]importorg.apache.commons.io.FileUtils;
[*]importorg.apache.commons.io.IOUtils;
[*]importorg.apache.cxf.jaxws.JaxWsProxyFactoryBean;
[*]
[*]publicclassFileTransferClient{
[*]
[*]
privatestaticfinalStringaddress="http://localhost:9000/ws/jaxws/fileTransferService";
[*]
[*]
privatestaticfinalStringclientFile="/home/fkong/temp/client/test.zip";
[*]
privatestaticfinalStringserverFile="/home/fkong/temp/server/test.zip";
[*]
[*]publicstaticvoidmain(String[]args)throwsException{
[*]
longstart=System.currentTimeMillis();
[*]//uploadFile();
[*]//downloadFile();
[*]
longstop=System.currentTimeMillis();
[*]System.out.println("Time:"+(stop-start));
[*]}
[*]
[*]privatestaticvoiduploadFile()throwsFileTransferException{
[*]
InputStreamis=null;
[*]try{
[*]
MyFilemyFile=newMyFile();
[*]
is=newFileInputStream(clientFile);
[*]
byte[]bytes=newbyte;
[*]while(true){
[*]
intsize=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(IOExceptione){
[*]thrownewFileTransferException(e.getMessage(),e);
[*]}finally{
[*]IOUtils.closeQuietly(is);
[*]}
[*]}
[*]
[*]privatestaticvoiduploadFile(MyFilemyFile)throwsFileTransferException{
[*]
JaxWsProxyFactoryBeanfactoryBean=newJaxWsProxyFactoryBean();
[*]factoryBean.setAddress(address);
[*]factoryBean.setServiceClass(FileTransferService.class);
[*]
Objectobj=factoryBean.create();
[*]
[*]
FileTransferServiceservice=(FileTransferService)obj;
[*]service.uploadFile(myFile);
[*]}
[*]
[*]privatestaticvoiddownloadFile()throwsFileTransferException{
[*]
MyFilemyFile=newMyFile();
[*]myFile.setServerFile(serverFile);
[*]
longposition=0;
[*]while(true){
[*]myFile.setPosition(position);
[*]
myFile=downloadFile(myFile);
[*]
if(myFile.getBytes().length<=0){
[*]break;
[*]}
[*]
[*]
OutputStreamos=null;
[*]try{
[*]if(position!=0){
[*]
os=FileUtils.openOutputStream(newFile(clientFile),true);
[*]}else{
[*]
os=FileUtils.openOutputStream(newFile(clientFile),false);
[*]}
[*]os.write(myFile.getBytes());
[*]}catch(IOExceptione){
[*]thrownewFileTransferException(e.getMessage(),e);
[*]}finally{
[*]IOUtils.closeQuietly(os);
[*]}
[*]
[*]position+=myFile.getBytes().length;
[*]}
[*]}
[*]
[*]privatestaticMyFiledownloadFile(MyFilemyFile)throwsFileTransferException{
[*]
JaxWsProxyFactoryBeanfactoryBean=newJaxWsProxyFactoryBean();
[*]factoryBean.setAddress(address);
[*]factoryBean.setServiceClass(FileTransferService.class);
[*]
Objectobj=factoryBean.create();
[*]
[*]
FileTransferServiceservice=(FileTransferService)obj;
[*]returnservice.downloadFile(myFile);
[*]}
[*]}
首先需要准备一个大一点的文件,然后修改代码中的clientFile和serverFile路径,然后分别打开uploadFile和downloadFile注释,运行程序,检查目标文件查看结果。
这个程序还是比较简单的,但基本生完成了文件上传下载功能,如果需要,也可以对这个程序再做点修改使其支持断点续传。
原文链接:http://blog.csdn.net/kongxx/article/details/7540930
【系列文章】
[*]
Apache CXF实战之六:创建安全的Web Service
[*]
Apache CXF实战之五:压缩Web Service数据
[*]
Apache CXF实战之四:构建RESTful Web Service
[*]
Apache CXF实战之三:传输Java对象
[*]
Apache CXF实战之二:集成Sping与Web容器
[*]
Apache CXF实战之一:Hello World Web Service
页:
[1]