下面是文件下载功能,可以实现大文件的断点续传,其原理是把服务端先把文件内容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));
}
}
相关推荐
java webservice基于xfire实例,该文档时继续java的 Xfire的webservie实例.
xfire简单实现webservice服务端创建与客户端,实现方法用的代理调用的,不需要服务端的接口。
手把手教你如何利用Xfire框架开发WebService
Android应用源码之在远程上传以及下载图片---XFire框架.zip
WebService之WSDL和SOAP实例(基于JAVA),博客地址:http://www.cnblogs.com/zhongshengzhen/p/4290670.html
使用xfire框架搭建的webService。主要有2个实例:SOAP Header中进行身份验证和WS-Security进行身份验证
xfire 开发所用的jar包合集,大全喔!
java使用XFire调用webService接口
用java通过xfire框架实现ws,实现正向生成wsdl文件,并由wsdl逆向生成java ws客户端代码 测试输入:http://localhost:8080/webservice-xfire/services/CalculatorService?wsdl
Android应用源码之在远程上传以及下载图片---XFire框架.zip项目安卓应用源码下载Android应用源码之在远程上传以及下载图片---XFire框架.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考...
NULL 博文链接:https://zhengdl126.iteye.com/blog/509487
java webservice XFire 写的列子,带有服务端和客户端。还有技术文档pdf格式,保证一看就让你懂。不懂得可以看文档,里面讲的很详细。我也是刚学。感觉文档很实用
NULL 博文链接:https://15838341661-139-com.iteye.com/blog/1139930
Android 在Android远程上传以及下载图片---XFire框架.zip项目安卓应用源码下载Android 在Android远程上传以及下载图片---XFire框架.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3....
XFire是Java实现WebService的一个框架,可以完成webservice服务的发布以及对发布接口的调用的全部jar包
xfire框架构建webservice应用: (通过myeclipse自动生成代码,自动导入xfire jar包,需要用jdk5.0) 需要的jar包:xFire 1.2 Core Libraries/xFire 1.2 HTTP Client Libraries/xFire 1.2 JAXB2 Libraries
xfire实现的web service应用,空项目,导入即可
最简单的MyEclipse8.0GA下使用Xfire框架开发WebService实例,逐个图片讲解。
这是一个完整的Xfire实现的java webservices 的demo,初学者可以很轻松的学会使用!
Android应用源码之在远程上传以及下载图片---XFire框架