你的位置:首页 > Java教程

[Java教程]CXF:通过WebService上传文件,包括大文件的处理


参考网上文章,用CXF发布上传文件接口,并上传大文件的测试。

框架:spring3.1+cxf2.7.6

1.定义文件类实体

import javax.activation.DataHandler;import javax./** * CXF上传和下载文件对象包装类 由于CXF的DataHandler无法获取文件名和文件类型,需要在上传和下载时附带文件名 * */public class CxfFileWrapper {  // 文件名  private String fileName = null;  // 文件扩展名  private String fileExtension = null;  // 文件二进制数据  private DataHandler file = null;  public final String getFileName() {    return fileName;  }  public final void setFileName(String fileName) {    this.fileName = fileName;  }  public final String getFileExtension() {    return fileExtension;  }  public final void setFileExtension(String fileExtension) {    this.fileExtension = fileExtension;  }  // 注解该字段为二进制流  @)  public final DataHandler getFile() {    return file;  }  public final void setFile(DataHandler file) {    this.file = file;  }}

2.定义服务接口

import javax.jws.WebMethod;import javax.jws.WebParam;import javax.jws.WebService;import net.bwda.domain.upload.CxfFileWrapper;@WebService(name = "FileWS", serviceName = "FileWS")public interface FileWS {  /**   * 文件上传   * @param file 文件上传包装类   * @return 上传成功返回true,上传失败返回false。   */  @WebMethod  boolean upload(@WebParam(name = "file") CxfFileWrapper file);  /**   * 文件下载   * @return 文件   */  @WebMethod  CxfFileWrapper download();}import java.io.BufferedOutputStream;import java.io.File;import java.io.FileOutputStream;import java.io.InputStream;import java.io.OutputStream;import javax.activation.DataHandler;import javax.activation.DataSource;import javax.activation.FileDataSource;import org.springframework.stereotype.Component;import org.springframework.stereotype.Service;import net.bwda.domain.upload.CxfFileWrapper;import net.bwda.service.upload.FileWS;@Service@Component("fileWS")public class FileWSImpl implements FileWS {  public boolean upload(CxfFileWrapper file){    boolean result = true;    OutputStream os = null;    InputStream is = null;    BufferedOutputStream bos = null;    try {      is = file.getFile().getInputStream();      File dest = new File("d:\\upload\\" + file.getFileName());      os = new FileOutputStream(dest);      bos = new BufferedOutputStream(os);      byte[] buffer = new byte[1024*1024];      int len = 0;      while ((len = is.read(buffer)) != -1) {        bos.write(buffer, 0, len);      }      bos.flush();    } catch (Exception e) {      e.printStackTrace();      result = false;    } finally {      if(bos != null){        try{          bos.close();        }catch(Exception e){                  }      }      if(os != null){        try{          os.close();        }catch(Exception e){                  }      }      if(is != null){        try{          is.close();        }catch(Exception e){                  }      }    }    return result;  }  public CxfFileWrapper download() {    //下载文件的路径     String filePath = "D:\\test.xlsx";    CxfFileWrapper fileWrapper = new CxfFileWrapper();    fileWrapper.setFileName("test.xlsx");    fileWrapper.setFileExtension("xlsx");    DataSource source = new FileDataSource(new File(filePath));    fileWrapper.setFile(new DataHandler(source));    return fileWrapper;  }}

3.定义CXF配置文件

image

<beans ="http://www.springframework.org/schema/beans"  ="http://www.w3.org/2001/ ="http://cxf.apache.org/jaxws"  xsi:schemaLocation="  http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsdhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"  ="http://cxf.apache.org/core">  <import resource="classpath:META-INF/cxf/cxf. />  <import resource="classpath:META-INF/cxf/cxf-servlet. />  <cxf:bus>    <cxf:properties>      <!-- 定义上传文件的最大长度,限制为256M -->      <entry key="org.apache.cxf.stax.maxTextLength" value="268435456" />    </cxf:properties>  </cxf:bus>  <jaxws:endpoint id="fileWSEndpoint" implementor="#fileWS"    address="/file">    <jaxws:properties>      <!-- 开启MTOM -->      <entry key="mtom_enabled" value="true"></entry>    </jaxws:properties>  </jaxws:endpoint></beans>

更多CXF配置,可参见:https://cxf.apache.org/docs/security.html。

 

4.生成客户端代码

d:\apache-cxf-2.7.6\bin\wsdl2java.bat -frontend jaxws21 -p com..test.webservice.file -client http://localhost:9080/filemark/webservice/file?wsdl

5.根据自动上传的代码上传文件测试

image

/** * Please modify this class to meet your needs * This class is not complete */import java.io.File;import java.net.URL;import javax.activation.DataHandler;import javax.activation.DataSource;import javax.activation.FileDataSource;import javax./** * This class was generated by Apache CXF 2.7.6 * 2016-11-10T18:37:44.270+08:00 * Generated source version: 2.7.6 * */public final class FileWS_FileWSImplPort_Client {  private static final QName SERVICE_NAME = new QName("http://upload.serviceimpl.bwda.net/", "FileWSImplService");  private FileWS_FileWSImplPort_Client() {  }  public static void main(String args[]) throws java.lang.Exception {    URL wsdlURL = FileWSImplService.WSDL_LOCATION;    FileWSImplService ss = new FileWSImplService(wsdlURL, SERVICE_NAME);    FileWS port = ss.getFileWSImplPort();         {    System.out.println("Invoking upload...");    net.bwda.Test.webservice.CxfFileWrapper _upload_file = new CxfFileWrapper();    _upload_file.setFileName("test.csv");    _upload_file.setFileExtension("csv");    DataSource source = new FileDataSource(new File("d:\\test.csv"));    _upload_file.setFile(new DataHandler(source));    boolean _upload__return = port.upload(_upload_file);    System.out.println("upload.result=" + _upload__return);    }    System.exit(0);  }}