ips99

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


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();
  DynamicClientTest web=new DynamicClientTest();
  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的大文件传输功能之二(上传)
posted @   迷途小石头  阅读(47)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示