文件夹的批量下载

这篇具有很好参考价值的文章主要介绍了文件夹的批量下载。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.业务背景

        公司想实现文件系统下载,上次图简单就草率的写了文件下载,这不趁着同事请假赶集吧这坑给填上。        

 文件夹的批量下载,java,笔记,java

2.遇到问题

        刚准备开始写,就头疼,文件只要获得数据输出流就行,但是这文件夹需要维护层级关系。文件夹的批量下载,java,笔记,java

        前端给的是服务器的绝对地址,还得服务器的文件名对的上,不然的下载个1.doc 2.txt 3.image,另外得考虑到如果文件夹下面的文件路径不存在会不会报错 

文件夹的批量下载,java,笔记,java

         因为每个文件夹的目录的和流关联起来 ,而且我们只知道下载的文件地址。所以在打成zip包的时候得考虑地址替换以及子文件夹创建的问题。

3.解决思路

        解决方法很简单,但可能一时半会给绕进去了,都想半天了。

        关于层级的问题:先去校验是否是文件进行递归操作 没啥难度

        关于路径的问题:使用下载路径作为根目录,是文件的时候将目录进行传递,也无需在打成zip包在做解析

        关于目录的问题:需要做标识,文件放的是字节数组,文件夹放的是null,在对应层级创建目录即可。文章来源地址https://www.toymoban.com/news/detail-668082.html

4.代码实现(展现ftp的实现方式)

        1.下载

   /**
     * 批量下载文件或者文件夹
     *
     * @param host      服务器地址
     * @param port      端口号
     * @param username  用户名
     * @param password  密码
     * @param downPaths 远程路徑
     * @return void
     */

    public Map<String, byte[]> batchDownloadFilesOrFolder(String host, int port, String username, String password, List<String> downPaths) throws IOException {
        FTPClient ftp = getFtpClient(host, port, username, password);
        Map<String, byte[]> fileBytesMap = new HashMap<>();

        for (String downPath : downPaths) {
            // 检查下载路径是否为文件夹
            String rootPath = StringUtils.getFileName(downPath);
            FTPFile ftpFile = ftp.mlistFile(downPath);
            if (ftpFile != null && ftpFile.isDirectory()) {
                fileBytesMap.put(rootPath , null);
                // 如果是文件夹,则递归调用下载文件夹的方法
                downloadDirectory(ftp, downPath, rootPath, fileBytesMap);
            } else {
                ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

                if (!ftp.retrieveFile(downPath, outputStream)) {
                    // 文件下载失败的处理逻辑,比如抛出异常或记录日志
                } else {
                    fileBytesMap.put(rootPath, outputStream.toByteArray());
                }
            }
        }

        return fileBytesMap;
    }

    /**
     * 下载文件夹的方法
     *
     * @param ftp
     * @param directoryPath
     * @param rootPath              根目录
     * @param fileBytesMap
     * @throws IOException
     */
    private void downloadDirectory(FTPClient ftp, String directoryPath, String rootPath, Map<String, byte[]> fileBytesMap) throws IOException {
        FTPFile[] files = ftp.listFiles(directoryPath);
        for (FTPFile file : files) {
            String filePath = directoryPath + "/" + file.getName();
            String relativePath = rootPath + "/" + file.getName();
            if (file.isFile()) {
                ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
                if (!ftp.retrieveFile(filePath, outputStream)) {
                    // 文件下载失败的处理逻辑,比如抛出异常或记录日志
                } else {
                    fileBytesMap.put(relativePath, outputStream.toByteArray());
                }
            } else if (file.isDirectory()) {
                // 递归调用下载文件夹的方法
                fileBytesMap.put(relativePath, null);
                downloadDirectory(ftp, filePath, relativePath, fileBytesMap);
            }
        }
    }

        2.打成zip包

    /**
     * 将下载的流写入zip
     *
     * @param bytesMap
     * @param response
     */
    private void downStreamWriteZip(Map<String, byte[]> bytesMap, HttpServletResponse response){
        try {
            // 设置响应头
            response.setHeader("Content-Disposition", "attachment; filename=files.zip");
            response.setContentType("application/zip");

            // 创建输出流
            ServletOutputStream outputStream = response.getOutputStream();
            ZipOutputStream zipOutputStream = new ZipOutputStream(outputStream);

            for (Map.Entry<String, byte[]> entry : bytesMap.entrySet()) {
                String fileName = entry.getKey();
                byte[] data = entry.getValue();
                if (data == null) {
                    // 文件夹,需要创建目录结构
                    ZipEntry zipEntry = new ZipEntry(fileName + "/");
                    zipOutputStream.putNextEntry(zipEntry);
                    zipOutputStream.closeEntry();
                } else {
                    // 文件,写入文件数据
                    ZipEntry zipEntry = new ZipEntry(fileName);
                    zipOutputStream.putNextEntry(zipEntry);
                    zipOutputStream.write(data);
                    zipOutputStream.closeEntry();
                }
            }

            // 关闭流
            zipOutputStream.close();
            outputStream.close();
        } catch (IOException e) {
            // 处理异常
        }
    }

到了这里,关于文件夹的批量下载的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Lua 批量修改文件夹下文件名

    2024年02月16日
    浏览(63)
  • Excel怎么批量生成文件夹

    Excel怎么批量生成文件夹的链接: https://jingyan.baidu.com/article/ea24bc398d9dcb9b63b3312f.html

    2024年02月09日
    浏览(42)
  • MAC&Windows批量生成文件夹

    在excel中复制要生成的子文件夹名,且在名字后面加上空格(不加空格直接生成文件夹,文件夹名字后面会有问号)。并生成一个包含子文件夹名的txt文档,如name.txt。mac中的txt文件可以在“文本编辑”中的“格式”选项卡中的“制作纯文本”,再保存文件,就可以生成txt文件

    2024年02月12日
    浏览(46)
  • 文件夹路径保存不同,什么批量修改名称

    在日常工作中不知道大家有没有遇到过,需要批量修改文件夹名称,并且文件夹保存路径不同呢,像这种情况到底不能批量修改呢。我也问了很多身边的朋友,他们有的说,他一般都修改保存路径是同一个,还很少遇到像我这样情况,他们给的建议是,分次修改,一次修改同

    2024年02月05日
    浏览(53)
  • 文件管理秘籍:如何实现批量移动,每个文件夹仅存一个文件

    在日常的生活和工作中,文件管理是一项常见的任务。有时候会遇到要把多个文件移动到同一个文件夹,或者要每个文件夹中只包含一个文件的情况。下面一起来看云炫文件管理器如何批量移动文件,有效地管理的文件。 详情页图片被分类移动文件夹中的前面截图展示。 每

    2024年01月16日
    浏览(66)
  • mac批量提取文件夹的名称,怎么操作?

        mac批量提取文件夹的名称,怎么操作?很多小伙伴想知道在mac电脑上可以一键快速批量的将大量文件夹的名提取出来,而不是采用一个一个名称提取的方法,这是一个有利于提高工作效率的办法,这一项技能在网上几乎找不到解决办法,不过经过小编的多方打听,还是给

    2024年02月16日
    浏览(51)
  • linux 再文件夹目录下,批量替换文件名、文件内容字符串

    基本使用命令 具体使用命令方法 1.替换文件内容 搜索当前目录下所有.DTA文件,并将文件中字符串\\\"string1\\\",替换为\\\"string2\\\" 2.替换文件名 搜索当前目录下所有.DTA文件,并将文件名中字符串\\\"string1\\\"替换为\\\"string2\\\". 3.批量替换文件内容 该目录及子目录下所有文件,将文件中所有的字符

    2024年02月16日
    浏览(60)
  • python如何批量读取一个文件夹里的所以excel文件

    在数据分析工作中,尝尝需要处理多个不同月的excel文件,但无奈与excel文件的局限性,不能同时处理多个月的excel数据,所以python的批量读取excel文件就显得十分重要,下面我将展示如何用python将每个月度的excel数据进行读取并汇总处理和输出。 最好excel的文件名就是按照日期

    2024年02月16日
    浏览(63)
  • 如何批量提取不同文件夹下的图片并随机重命名

    无论是在为了跑深度学习模型而准备数据集,还是其他的一些用途,相信大家都会遇到一个问题:我所需要的图片分布在很多不同的文件夹下,但我不需要这么多文件夹,那么我如果要使用这些图片的话,就需要把这些文件夹下的图片一个个提取出来,然后再放到新建的文件

    2024年02月12日
    浏览(71)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包