JAVA应用XFire框架来实现WebServie的大文件传输功能之二(上传)
来源:互联网 发布:mac没有任何来源选项 编辑:程序博客网 时间:2024/06/05 14:33
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 long upload(String filename,int action,String datastr);
}
服务端文件:
package service;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import javax.servlet.http.HttpServletRequest;
import org.codehaus.xfire.transport.http.XFireServletController;
import org.codehaus.xfire.util.Base64;
public class HelloWorldImpl implements IHelloWorld {
/**
* @filename:要下载的文件名(全名);
* @action:客户端要上传一份文件,考虑到断点续传功能,就必须要知道服务器上的文件现在的大小,才能确定从哪个位置开始传输,所以设计了这个action参数,值为0时表示询问文件大小,为1时表示传输的第三个参数datastr就是经过Base64编码的文件内容字符串;
* @datastr:经过Base64编码的内容字符串;
* @return:把文件的实时大小作为最新位置返回;
*/
public long upload(String filename,int action,String datastr){
String filepath="e://aaa//";
long filesize=0;
try{
if (!filename.equals(null) && !filename.equals("")){
File file=new File(filepath+filename);
if(action==0){
return file.length();
}else{
RandomAccessFile raf=new RandomAccessFile(file,"rw");
raf.seek(file.length());//先定位
byte[] bytes = Base64.decode(datastr);
raf.write(bytes);
//raf.skipBytes(datastr.length());//顺序写
raf.close();
//System.out.println("文件位置:"+file.length());
//System.out.println("写入长度:"+datastr.length());
filesize=file.length();
}
}
return filesize;
}catch(Exception e){
e.printStackTrace();
return 0;
}
}
}
客户端代码:
package service;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
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";
DynamicClientTest web=new DynamicClientTest();
Long start=System.currentTimeMillis();
Object[] results4=web.getWebService(surl, "upload", new Object[] { "test.rar",0,null});
long startpost=(Long)results4[0];
//System.out.println("起始位置:"+startpost);
int BUFFER_LENGTH = 1024 * 20;//一次性读入大小
int SLEEP_TIME=250;//循环读次数
long filesize=0;
FileInputStream fis = null;
try {
File upfile=new File("e://GMS.rar");
filesize=upfile.length();
//System.out.println("文件大小:"+filesize);
fis=new FileInputStream(upfile);
fis.skip(startpost);//读文件前,先定位
while(startpost<filesize){
StringBuffer sb = new StringBuffer();
int time=0;
byte[] buffer = new byte[BUFFER_LENGTH];
int count=-1;
while (time<SLEEP_TIME && (count = fis.read(buffer)) != -1) {//这里要特别注意“time<SLEEP_TIME”条件一定要放在“(count = fis.read(buffer)) != -1”的前面,“&&”是在满足第一个条件的前提下才继续判断第二个条件的,否则,不管是否执行循环下面的代码,只要fis.read(buffer)一执行,读取文件的定位都会往后移,这样会造成下一次循环读取的数据就不对了。
sb.append(Base64.encode(buffer,0,count));
time++;
}
String ret= sb.toString();
results4=web.getWebService(surl, "upload", new Object[] { "test.rar",1,ret});
startpost=(Long)results4[0];
//System.out.println("位置:"+startpost);
}
Long end=System.currentTimeMillis();
System.out.println("用时:"+(end-start));
} 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();
}
}
}
- JAVA应用XFire框架来实现WebServie的大文件传输功能之二(上传)
- JAVA应用XFire框架来实现WebServie的大文件传输功能之一(下载)
- JAVA应用XFire框架来实现WebServie的大文件传输功能之一(下载)
- c++实现文件传输之二:功能实现
- c++实现文件传输之二:功能实现
- c++实现文件传输之二:功能实现
- 实现的局域网内大文件传输(ftp功能)
- 记录个java大文件上传功能的实现
- Java三大框架之struts的上传文件
- Java三大框架之struts的多文件上传
- 企业级服务器设计与实现经验之系统框架(二)--功能/应用服务器主体框架
- 企业级服务器设计与实现经验之系统框架(二)--功能/应用服务器主体框架
- 企业级服务器设计与实现经验之系统框架(二)--功能/应用服务器主体框架
- Java三大框架之struts的上传文件出错信息配置(允许上传的类型,上传文件的大小,以及大文件上传说明等等)
- c++实现文件传输之二
- c++实现文件传输之二
- c++实现文件传输之二
- socket文件传输功能的实现
- cx_Oracle使用方法
- MyBatis一对多demo!!!
- VC中调用其他应用程序
- SD–关于自动信贷控制的”未清项目”"最大未清项%”"未清项目天数”的说明
- C#自定义事件的步骤介绍
- JAVA应用XFire框架来实现WebServie的大文件传输功能之二(上传)
- 模块中分配和释放堆的问题
- Excel锁定单元格【转帖】
- 算法导论 红黑树基础知识
- 深入SSL协议的规范和运作原理
- 修改MFC Dialog 的 class name
- 好久没更新了
- VC打开对话框
- google protocol buffers vs apache thrift