CXF:通過WebService上傳檔案,包括大檔案的處理,cxfwebservice
參考網上文章,用CXF發布上傳檔案介面,並上傳大檔案的測試。
架構:spring3.1+cxf2.7.6
1.定義檔案類實體
import javax.activation.DataHandler;import javax.xml.bind.annotation.XmlMimeType;/** * 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; } // 註解該欄位為二進位流 @XmlMimeType("application/octet-stream") 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設定檔
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="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" xmlns:cxf="http://cxf.apache.org/core"> <import resource="classpath:META-INF/cxf/cxf.xml" /> <import resource="classpath:META-INF/cxf/cxf-servlet.xml" /> <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.根據自動上傳的代碼上傳檔案測試
/** * 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.xml.namespace.QName;/** * 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); }}