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

    技术2022-05-20  42

    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();           }       }}


    最新回复(0)