美文网首页
2019-10-22 spring boot文件批量下载

2019-10-22 spring boot文件批量下载

作者: 忆丶往 | 来源:发表于2019-11-18 10:57 被阅读0次
    @Controller
    @RequestMapping(value = "/download")
    public class FileAction {
    
        /**
         * 下载
         *
         * @param response
         */
    
        @RequestMapping(value = "/imgdownload", method = RequestMethod.GET)
        public void imgDownload(HttpServletResponse response) {
            List<String> paths = new ArrayList<>();
            String file1 = "C:\\Users\\84695\\Desktop\\GDS\\ECMWF_HR\\RAIN24\\19061408.036";
            String file2 = "C:\\Users\\84695\\Desktop\\GDS\\ECMWF_HR\\RAIN24\\19061408.024";
            paths.add(file1);
            paths.add(file2);
            List<String> names = new ArrayList<>();
            String filess = "19061408.036";
            String files = "19061408.024";
            names.add(filess);
            names.add(files);
            //存放--服务器上zip文件的目录
            String directory = "D:\\repository\\test";
            File directoryFile = new File(directory);
            if (!directoryFile.isDirectory() && !directoryFile.exists()) {
                directoryFile.mkdirs();
            }
    
            //设置最终输出zip文件的目录+文件名
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy年MM月dd日HH时mm分ss秒");
            String zipFileName = formatter.format(new Date()) + ".zip";
            String strZipPath = directory + "\\" + zipFileName;
            ZipOutputStream zipStream = null;
            FileInputStream zipSource = null;
            BufferedInputStream bufferStream = null;
            File zipFile = new File(strZipPath);
            try {
                //构造最终压缩包的输出流
                zipStream = new ZipOutputStream(new FileOutputStream(zipFile));
                for (int i = 0; i < paths.size(); i++) {
                    //解码获取真实路径与文件名
                    String realFileName = java.net.URLDecoder.decode(names.get(i), "UTF-8");
                    String realFilePath = java.net.URLDecoder.decode(paths.get(i), "UTF-8");
                    File file = new File(realFilePath);
                    //TODO:未对文件不存在时进行操作,后期优化。
                    if (file.exists()) {
                        zipSource = new FileInputStream(file);//将需要压缩的文件格式化为输入流
    /**
     * 压缩条目不是具体独立的文件,而是压缩包文件列表中的列表项,称为条目,就像索引一样这里的name就是文件名,
     * 文件名和之前的重复就会导致文件被覆盖
    
     */
                        ZipEntry zipEntry = new ZipEntry(realFileName);//在压缩目录中文件的名字
                        zipStream.putNextEntry(zipEntry);//定位该压缩条目位置,开始写入文件到压缩包中
                        bufferStream = new BufferedInputStream(zipSource, 1024 * 10);
                        int read = 0;
                        byte[] buf = new byte[1024 * 10];
                        while ((read = bufferStream.read(buf, 0, 1024 * 10)) != -1) {
                            zipStream.write(buf, 0, read);
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
    //关闭流
                try {
                    if (null != bufferStream) {
                        bufferStream.close();
                    }
                    if (null != zipStream) {
    
                        zipStream.close();
                    }
                    if (null != zipSource) {
                        zipSource.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            //判断系统压缩文件是否存在:true-把该压缩文件通过流输出给客户端后删除该压缩文件 false-未处理
            if (zipFile.exists()) {
                downImg(response, zipFileName, strZipPath);
                zipFile.delete();
            }
        }
    
        public void downImg(HttpServletResponse response, String filename, String path) {
    
            if (filename != null) {
                FileInputStream is = null;
                BufferedInputStream bs = null;
                OutputStream os = null;
                try {
                    File file = new File(path);
                    if (file.exists()) {
                        //设置Headers
                        response.setHeader("Content-Type", "application/octet-stream");
                        //设置下载的文件的名称-该方式已解决中文乱码问题
                        response.setHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes("gb2312"), "ISO8859-1"));
                        is = new FileInputStream(file);
                        bs = new BufferedInputStream(is);
                        os = response.getOutputStream();
                        byte[] buffer = new byte[1024];
                        int len = 0;
                        while ((len = bs.read(buffer)) != -1) {
                            os.write(buffer, 0, len);
                        }
                    } else {
                        response.sendRedirect("/imgUpload/imgList?error=" + "下载的文件资源不存在");
                    }
                } catch (IOException ex) {
                    ex.printStackTrace();
                } finally {
                    try {
                        if (is != null) {
                            is.close();
                        }
                        if (bs != null) {
                            bs.close();
                        }
                        if (os != null) {
                            os.flush();
                            os.close();
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    

    原博客地址(很强!!!)

    相关文章

      网友评论

          本文标题:2019-10-22 spring boot文件批量下载

          本文链接:https://www.haomeiwen.com/subject/ttofvctx.html