CXF:通过WebService上传文件,包括大文件的处理

参考网上文章,用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配置文件

image

<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.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://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.6inwsdl2java.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.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);
    }

}
原文地址:https://www.cnblogs.com/huiy/p/6052221.html