首页 > 编程语言 >JAVA应用XFire框架来实现WebServie的大文件传输功能之一(下载)

JAVA应用XFire框架来实现WebServie的大文件传输功能之一(下载)

时间:2023-09-21 15:15:30浏览次数:55  
标签:WebServie file java String 文件传输 new io import JAVA


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

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

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

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

xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xfire.codehaus.org/config/1.0">
    <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定位参数来实现断点续传;
  * @return:把文件内容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="http://localhost:8080/WebServiceTest/services/HelloWorldService?wsdl";     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){      DynamicClientTest web = new DynamicClientTest();
      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));
}
}

标签:WebServie,file,java,String,文件传输,new,io,import,JAVA
From: https://blog.51cto.com/u_16230604/7554603

相关文章

  • Javascript闭包(Closure)
    闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。下面就是我的学习笔记,对于Javascript初学者应该是很有用的。一、变量的作用域要理解闭包,首先必须理解Javascript特殊的变量作用域。变量的作用域无非就是两种:全局变量和局部变量。Javascript语言......
  • JAVA中常用IO流类:FileReader和FileWriter
    1,FileWriter类(字符输出流类)构造方法:FileWriterfw=newFileWriter(StringfileName);//创建字符输出流类对象和已存在的文件相关联。文件不存在的话,并创建。                                            如:FileWriterfw=new......
  • java通过jdbc复制表数据实现备份
    importorg.apache.commons.lang3.StringUtils;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;importjava.sql.*;@Servicepublicclass......
  • 【JavaWeb3】Maven环境搭建
    前言:为什么要学习Maven?在JavaWeb开发中,需要使用大量的jar包,我们手动导入很麻烦,而学习Maven它可以帮我们自动配置和导入这些jar包Maven作为依赖管理工具,能够管理规模庞大jar包。使用Maven后,依赖对应的Jar包能够自动下载、方便、快捷且规范。Maven作为构建管理工具。当我们使用......
  • 无涯教程-JavaScript - COUNTIFS函数
    描述COUNTIFS函数将多个条件应用于跨多个范围的单元格,并计算满足所有条件的次数。语法COUNTIFS(criteria_range1,criteria1,[criteria_range2,criteria2]…)争论Argument描述Required/Optionalcriteria_range1Thefirstrangeinwhichtoevaluatetheassociat......
  • 基于Java开发的工作流审批系统(成熟源码)
    前言目前市场上有很多开源平台没有整合工作流,即使有,也是价格不菲的商业版,来看这篇文章的估计也了解了行情,肯定不便宜。我这个快速开发平台在系统基础功能(用户管理,部门管理…)上整合了工作流,你可以直接用来开发ERP,OA,CRM等企业级应用,不用再担心如何再去花大量的时间集成工作流进来。......
  • Java大文件上传(秒传、分片上传、断点续传)
    一、秒传秒传就是不传,实现逻辑就是看数据库或者缓存里是否已经有这个文件了,有了,直接从已有的文件去拿就可以了(返回文件地址)。这里判断是否是相同文件,要用到信息摘要算法,详情可以参考:一文读懂当前常用的加密技术体系。信息摘要算法常常被用来保证信息的完整性,防止信息在传输过程中......
  • Javascript中window.setInterval和window.setTimeout的区别
    在使用JScript的时候,我们有时需要间隔的执行一个方法,比如用来产生网页UI动画特效啥的。这是我们常常会使用方法setInterval或setTimeout,但是由于这两个方法是由脚本宿主模拟出来的Timer线程,在通过其调用我们的方法是不能为其传递参数。我们常用的使用场景是:代码如下:window.setTi......
  • 无涯教程-JavaScript - COUNTIF函数
    描述COUNTIF函数计算符合条件的单元格数。语法COUNTIF(range,criteria)争论Argument描述Required/Optionalrange您要计数的单元格组。范围可以包含数字,数组,命名范围或包含数字的引用。空白和文本值将被忽略。RequiredcriteriaAnumber,expression,cellr......
  • JavaScript函数大全 集合
    JavaScript函数大全集合javascript提供了许多函数供开发人员使用,下面给出一个简单介绍,更详细的信息请参考VisualInterDev提供的在线帮助。javascript函数一共可分为五类:·常规函数·数组函数·日期函数·数学函数·字符串函数1.常规函......