博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA应用XFire框架来实现WebServie的大文件传输功能之一(下载)
阅读量:6672 次
发布时间:2019-06-25

本文共 3844 字,大约阅读时间需要 12 分钟。

hot3.png

 下面是文件下载功能,可以实现大文件的断点续传,其原理是把服务端先把文件内容Byte[]转换成Base64编码字符串返回给客户端,然后客户端接收到后再把该Base64编码过的字符串转换成Byte[],最后写入文件。

      至于断点续传的设计很简单,服务端留有一个定位参数,每次读取文件之前,都先定位,然后客户端在调用WebService接口之前,先取得本地该文件的大小,再把该值作为定位参数传过去就OK,最后根据接收到的字符串的长度为0时作为文件传输完毕的判断依据。

      另外如果想做到实时取得文件传输的进度的话,可以设计一个地址参数,根据累计传输大小来返回即可,在这里略过。

文件上传部分代码反过来即可,这里也略过。

xml文件:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="">

    <service>

       <name>HelloWorldService</name>

       <namespace>http://localhost:8090/WebServiceTest

       </namespace>

       <serviceClass>service.IHelloWorld</serviceClass>

       <implementationClass>service.HelloWorldImpl

       </implementationClass>

    </service>

</beans>

 

接口文件:

package service;

public interface IHelloWorld { 

    //sayHello 方法声明了Web服务对外暴露的接口

    public String download(String filename,long startpost) throws Exception ;
}

服务端文件:

package service;

import java.io.File;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.RandomAccessFile;

import javax.activation.DataHandler;

import javax.servlet.http.HttpServletRequest;

import org.codehaus.xfire.transport.http.XFireServletController;

import org.codehaus.xfire.util.Base64;

public class HelloWorldImpl implements IHelloWorld {

 private RandomAccessFile raf=null;
 
 /**
  * @filename:要下载的文件名(全名);
  * @startpost:由于WebService不能一次性传输大文件,所以使用startpost定位参数来实现断点续传;
  * :把文件内容Byte[]转换成Base64编码返回;
  */
 public String download(String filename,long startpost) throws Exception {
  //System.out.println("要下载的文件名是:"+filename);
  int BUFFER_LENGTH = 1024 * 20;//一次性读入大小
  int SLEEP_TIME=250;//循环读次数
  int time=0;
  long filesize=0;
  String ret=null;
  String str=null;
  File file=new File("e:\\",filename);
  if (file.exists()) {
   filesize=file.length();
            FileInputStream fis = null;   
            try {  
                fis = new FileInputStream(file); 

                StringBuffer sb = new StringBuffer();   

               //System.out.println("定位:"+startpost);
                fis.skip(startpost);//先定位
                byte[] buffer = new byte[BUFFER_LENGTH];  
                int count;  
                while (time<SLEEP_TIME && (count = fis.read(buffer)) != -1 ) {
                    sb.append(Base64.encode(buffer,0,count)); 
                    time++;
                }  
                ret = sb.toString(); 
               //System.out.println("输出:"+ret.length());
            } catch (FileNotFoundException e) {  
                e.printStackTrace();  
                throw new Exception("出错啦!", e);  
            } catch (IOException e) {  
                e.printStackTrace();  
                throw new Exception("出错啦!", e);  
            } catch (Exception e) {  
                throw new Exception("出错啦!", e);  
            } finally {  
                fis.close();  
            }  
        }  

  return ret;

 }
 

}

客户端文件:

package service;

import java.io.File;

import java.io.RandomAccessFile;
import java.net.MalformedURLException;
import java.net.URL;

import org.codehaus.xfire.client.Client;

import org.codehaus.xfire.transport.http.HttpTransport;
import org.codehaus.xfire.util.Base64;

public class DynamicClientTest {
 public Object[] getWebService(String surl,String saction,Object[] objarr) throws MalformedURLException,Exception
 {
   Client client = new Client(new URL(surl));
   //client.setProperty("mtom-enabled", "true");
   client.setProperty(HttpTransport.CHUNKING_ENABLED,"true");
   Object[] results = client.invoke(saction, objarr);
   return results;

 }

    public static void main(String[] args) throws MalformedURLException,Exception {
     String surl="";
     

  Long start=System.currentTimeMillis();

  
     File file=new File("e:\\","test.rar");
     RandomAccessFile raf=new RandomAccessFile(file,"rw");
     //System.out.println("文件大小:"+file.length());
     raf.seek(file.length());//先定位
     boolean isend=false;
     while (!isend){
      Object[] results3=web.getWebService(surl, "download", new Object[]{"GMS.rar",file.length()});
      String data=(String)results3[0];
      //System.out.println("返回大小:"+data.length());
      byte[] bytes = Base64.decode(data);
      raf.write(bytes);
      raf.skipBytes(data.length());//顺序写
      if(data.length()<=0){isend=true;}
     }
     raf.close();

  Long end=System.currentTimeMillis();

  System.out.println("用时:"+(end-start));
}
}

 

转载于:https://my.oschina.net/u/1044955/blog/277022

你可能感兴趣的文章
阿里云DTS VS MySQLdump
查看>>
为android封装的百度定位组件
查看>>
我的友情链接
查看>>
Linux系统新手学习的11点建议
查看>>
Android SDK:构建一个购物中心搜索的应用(二)-Points of Interest
查看>>
通过TFTP服务器拷贝路由器的配置文件到本地
查看>>
南方电网广东公司荣获“IT用户最佳实践案例奖”
查看>>
Yesod - 数据库 (9)
查看>>
redis多数据库
查看>>
RHCE认证培训+考试七天实录(五)
查看>>
ip nat translation (timeout)
查看>>
创建外网 ext_net - 每天5分钟玩转 OpenStack(104)
查看>>
api数据分页的两种方式的比较
查看>>
Python OpenCV学习笔记之:图像直方图反向投影
查看>>
布隆过滤器:实现代码
查看>>
使用Spring MVC开发RESTful API
查看>>
js复制input到剪切板(ie内核浏览器)单个input简洁版
查看>>
mysql.sock丢失解决
查看>>
BISO
查看>>
好程序员分享http的keep-alive和tcp的keep-alive区别
查看>>