• 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);
        }
    
    }
  • 相关阅读:
    useCallback优化React Hooks程序性能
    useMemo优化React Hooks程序性能,解决子组件重复执行问题
    使用 useReducer 和 useCallback 解决 useEffect 依赖诚实与方法内置&外置问题
    createContext 和 useContext 结合使用实现方法共享(React Hook跨组件透传上下文与性能优化)
    浅谈开发变量作用域---小坑
    优雅的在React项目中使用Redux
    浅谈react无状态组件(哑组件)和有状态组件(智能组件)的区别
    浅谈react-router和react-router-dom、react-router-native的区别
    windows系列CMD替换品Terminal控制台推荐——ConsoleZ
    struts——文件上传
  • 原文地址:https://www.cnblogs.com/huiy/p/6052221.html
Copyright © 2020-2023  润新知