java web ftp 打包下载文件

java web ftp 打包下载文件

import org.apache.commons.io.FileUtils;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

 /**
     * 多文件下载
     * @param fileSns  文件sn
     * @param fileName 文件名称sn
     * @param response 响应
     * @return 视图
     */
    @RequestMapping(value = "/download-files", method = RequestMethod.GET)
    public void downloadFiles(@RequestParam List<Long> fileSns, String fileName, HttpServletRequest request, HttpServletResponse response) {
        if (fileSns == null || fileSns.isEmpty()) {
            throw new RuntimeException("文件为空");
        }
        //获取ftp存储的文件信息
        List<File> files = fileService.findListBySn(fileSns);
        if (files.isEmpty()) {
            throw new RuntimeException("没有找到文件");
        }
        //临时文件
        java.io.File tempFile;
        //Zip工具
        ZipOutputStream out = null;
        //获取临时文件目录
        java.io.File fileDirecotry = FileUtils.getTempDirectory();
        if (StringUtils.isNotBlank(fileName)) {
            //前端传过来的文件名要经过Base64加密,主要解决IE浏览器URL包含中文字符而无法正确请求地址
            //中文Base64加密可以参考下面里链接:
            //https://blog.csdn.net/Michean/article/details/86299631
            //https://blog.csdn.net/Michean/article/details/86294679
        	fileName = new String(Base64Utils.decode(fileName));
            fileName += "-" + System.currentTimeMillis();
        } else {
            fileName = UUID.randomUUID().toString();
        }
        try {
            //创建临时zip文件
            tempFile = java.io.File.createTempFile(fileName, ".zip", fileDirecotry);
            out = new ZipOutputStream(new FileOutputStream(tempFile));
            List<String> names = new ArrayList<>();
            //将多个文件写入zip
            for (File file : files) {
                //文件名去重
                String name = distinctName(names, file.getOriginal());
                //往zip文件流中写文件
                out.putNextEntry(new ZipEntry(name));
                //省去ftp链接
                ftpClient.retrieveFile(file.getPath(), out)
                out.flush();
                out.closeEntry();
            }
            //所有文件写完后一定要关闭输出流,否则文件下载会不完整。
            out.flush();
            out.close();

            //将zip文件写入响应
            String name;
            String userAgent = request.getHeader("user-agent").toLowerCase();
            if (userAgent.contains("msie") || userAgent.contains("like gecko")) {
                // IE 中文编码
                name = URLEncoder.encode(tempFile.getName(), "UTF-8");
            } else {
                // 非IE 中文编码
                name = new String(tempFile.getName().getBytes("UTF-8"), "ISO-8859-1");
            }
            response.setHeader("Content-Disposition", "attachment; filename=" + name);
            OutputStream os = new BufferedOutputStream(response.getOutputStream());
            InputStream in = new BufferedInputStream(new FileInputStream(tempFile));
            int len;
            byte[] buf = new byte[1024];
            while ((len = in.read(buf)) > 0) {
                os.write(buf, 0, len);
            }
            os.flush();
            os.close();
            in.close();
            response.flushBuffer();
            FileUtils.deleteQuietly(tempFile);
        } catch (Exception e) {
            e.printStackTrace();
            if (out != null) {
                try {
                    out.close();
                } catch (IOException ie) {
                    ie.printStackTrace();
                }
            }
            throw new RuntimeException();
        }
    }
    /**
     * 文件名去重
     * @param names 名称集合
     * @param name  文件名
     * @return 去重文件名
     */
    private String distinctName(List<String> names, String name) {
        if (!names.contains(name)) {
            names.add(name);
            return name;
        }
        int count = 0;
        int pos = name.lastIndexOf(StringUtils.DOT);
        String namePrev = name;
        String nameEnd = "";
        if (pos > 0) {
            namePrev = name.substring(0, pos);
            nameEnd = name.substring(pos);
        }
        String tmpName;
        do {
            count++;
            tmpName = namePrev + StringUtils.LEFT_BRACKET + count + StringUtils.RIGHT_BRACKET + nameEnd;
        } while (names.contains(tmpName));
        names.add(tmpName);
        return tmpName;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值