zoukankan      html  css  js  c++  java
  • java批量下载,将多文件打包成zip格式下载

    现在的需求的:

    根据产品族、产品类型,下载该产品族、产品类型下面的pic包;

    pic包是zip压缩文件;

    t_product表:

    这些包以blob形式存在另一张表中:

    t_imagefile表:

    现在要做的是:将接入网、OLT下面的两个包downloadPIC:MA5800系列-pic.zip 和 MA5900-pic.rar一起打包成zip压缩文件下载下来;

    代码:

    ProductController.java:

        /**
         * 根据产品族、产品类型下载照片包
         */
        @RequestMapping("/downloadwBatch")
        public void downloadwBatch(HttpServletRequest request, HttpServletResponse response, String productFamily, String productType){
            //http://localhost:8080/MySSM/downloadwBatch?productFamily=接入网&productType=OLT
            try {
                productFamily = new String(productFamily.getBytes("iso-8859-1"), "utf-8");
                productType = new String(productType.getBytes("iso-8859-1"), "utf-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            
            //获取要下载的照片包名
            Map<String, String> params = new HashMap<String, String>();
            params.put("productFamily", productFamily);
            params.put("productType", productType);
            List<String> packageNames = productService.getPackageNamesByFamilyAndType(params);
            
            //根据包名获取待下载的文件    文件名-字节数组的形式
            Map<String, byte[]> files = new HashMap<String, byte[]>();
            for(String packageName : packageNames){
                byte[] f = productService.getPackage(packageName);
                if(f!=null){
                    files.put(packageName, f);
                }
            }
            
            //设置下载的压缩包名
            String zipName = productFamily + "_"+ productType + ".zip";
            
            //根据文件,进行压缩,批量下载
            if(files.size() > 0){
                productService.downloadBatchByFile(response, files, zipName);
            }
            
        }

    ProductService.java:

        /**
         * 根据包名获取文件
         */
        public byte[] getPackage(String packageName){
            byte[] bag  = null;
            try{
                ImageFile m = productMapper.getPackage(packageName);
                if(m!=null){
                    bag = m.getPicture();
                }
            }catch(Exception e){
                e.printStackTrace();
            }
            return bag;
        }
        
        
        /**
         * 根据产品族、产品类型 获取待下载的包名
         * @param params
         * @return
         */
        public List<String> getPackageNamesByFamilyAndType(Map<String, String> params) {
            List<String> packageNames = productMapper.getPackageNamesByFamilyAndType(params);
            
            return packageNames;
        }
        
        /**
         * 根据文件,进行压缩,批量下载
         * @param response
         * @param files
         * @throws Exception 
         */
        public void downloadBatchByFile(HttpServletResponse response, Map<String, byte[]> files, String zipName){
            try{
                response.setContentType("application/x-msdownload");
                response.setHeader("content-disposition", "attachment;filename="+URLEncoder.encode(zipName, "utf-8"));
                
                ZipOutputStream zos = new ZipOutputStream(response.getOutputStream());
                BufferedOutputStream bos = new BufferedOutputStream(zos);
                
                for(Entry<String, byte[]> entry : files.entrySet()){
                    String fileName = entry.getKey();            //每个zip文件名
                    byte[]    file = entry.getValue();            //这个zip文件的字节
                    
                    BufferedInputStream bis = new BufferedInputStream(new ByteArrayInputStream(file));
                    zos.putNextEntry(new ZipEntry(fileName));
                    
                    int len = 0;
                    byte[] buf = new byte[10 * 1024];
                    while( (len=bis.read(buf, 0, buf.length)) != -1){
                        bos.write(buf, 0, len);
                    }
                    bis.close();
                    bos.flush();
                }
                bos.close();
            }catch(Exception e){
                e.printStackTrace();
            }
        }

    ProductMapper.java:

        /**
         * 根据包名获取文件
         */
        public ImageFile getPackage(String packageName) throws Exception;
    
        /**
         * 据产品族、产品类型 获取待下载的包名
         */
        public List<String> getPackageNamesByFamilyAndType(Map<String, String> params);
    View Code

    ProductMapper.xml:

        <!-- 根据包名获取文件 -->
        <select id="getPackage" parameterType="java.lang.String" resultType="com.cy.model.ImageFile">
            select * from t_imagefile where packageName = #{packageName}
        </select>
        
        <!--  跟据产品族、产品类型 获取待下载的包名 -->
        <select id="getPackageNamesByFamilyAndType" parameterType="java.util.Map" resultType="java.lang.String">
            select packageName from t_imagefile m join t_product p on m.packageName = p.downloadPic
            where p.productFamily = #{productFamily} and p.productType = #{productType}
        </select>
    View Code

    测试:

    在浏览器中输入:http://localhost:8080/MySSM/downloadwBatch?productFamily=接入网&productType=OLT

    下载结果如下:

    ---------

  • 相关阅读:
    【.net】从比较两个字节数组谈起
    不靠谱招聘信息大围观 第一季
    微软社区大课堂招募学生
    [WPF]带下拉列表的文本框
    SVN: is scheduled for addition, but is missing
    bootstrap模态框手动开启关闭与设置点击外部不关闭
    PHP实现各种经典算法
    使用vue如何默认选中单选框
    vue使用resource传参数
    视频处理工具FFmpeg的安装(windows/Linux)
  • 原文地址:https://www.cnblogs.com/tenWood/p/7582436.html
Copyright © 2011-2022 走看看