ftp服务器批量下载文件之retrieveFileStream (方式一)

2023-05-16

1.首先先说一下这些坑:(组合套装)

标题

这个行代码一定要注意, 而且随时打印code码,以便确认错误.

2.大致思路:

3. 先根据ID查询出来url

@RequestMapping(value="test1", produces = "text/plain;charset=UTF-8")
public void test2(HttpServletRequest request ,HttpServletResponse response){
        try {
            
                List<Map<String, Object>> queryForList = jdbcTemplate.queryForList(" select url from tb_work_record where FIND_IN_SET(wr_id,'1,2')  ");
                List<String> filePaths=new ArrayList<String>();
                for (int i = 0; i < queryForList.size(); i++) {
                    filePaths.add(queryForList.get(i).get("url").toString());
                }
                test2(request, response, filePaths);
        } catch (Exception e) {
            e.printStackTrace();
        }
}

4.压缩 ,调用浏览器下载,删除 web服务器临时产生zip文件

public void test2(HttpServletRequest request ,HttpServletResponse response,List<String> filePaths){

           //根据url获取文件流压缩到zip文件中(重点中的重点)
            String  zipFilePath = copy(filePaths);
            //调用浏览器下载
            template(response, zipFilePath);

            删除 web服务器临时产生zip文件
            new File(zipFilePath);
    }

5.//根据url获取文件流压缩到zip文件中

5-1.首先去ftp服务器上循环拿到文件流和文件名,

5-2.循环拿的同时循环写入到web服务器中的zip文件(可能有人要问为什么循环拿的同时要去循环写入呢? 因为每次 InputStream in = ftp.retrieveFileStream(path)  时 in都要close之后才能重新调用retrieveFileStream方法, 如果不close ,则会在第二次时in为null,或者直接假死, 但是你不能把in.close(),之后 再去调BufferedInputStream输出流写入到zip中 ,所以必须边循环拿流边循环写入到zip)

public String copy(List<String> remotePath) {
        Map<String, Object> map = new HashMap<>();
        FTPClient ftp = new FTPClient();
        String zipBasePath = "E://upload"; //web服务器地址

         
        String zipName =" test.zip";
        String zipFilePath = zipBasePath + File.separator + zipName;//web服务器zip文件地址
        try {

            File zip = new File(zipFilePath);//在web服务器上创建文件
            if (!zip.exists()) {
                zip.createNewFile();
            }
            ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zip));

            // 创建FTPClient对象
            String host = "172.168.31.123";
            Integer port = 21;
            String username = "******";
            String password = "*******";
            // 连接FTP服务器
            // 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
            ftp.connect(host, port);
            // 登录ftp
            ftp.login(username, password);
            ftp.setControlEncoding("UTF-8"); // 中文支持
            ftp.enterLocalPassiveMode();//一定要加上
            for (int j = 0; j < remotePath.size(); j++) {
                String path = remotePath.get(j);
                ftp.changeWorkingDirectory("/");
                String fileName = StringUtils.substringAfterLast(remotePath.get(j), "/");
                InputStream in = ftp.retrieveFileStream(path);//拿到流
                map.put("io", in);
                map.put("name", URLDecoder.decode(fileName, "UTF-8"));
                zipFileList(zipBasePath, zipName, zipFilePath, map, zos); //没关闭in之前,先写入到zip中
                in.close();
                ftp.completePendingCommand();
                System.out.println(ftp.getReplyCode());
            }
            zos.close();
        } catch (Exception e) {
            System.out.println(ftp.getReplyCode());
            e.printStackTrace();
        }
        return zipFilePath;
    }

6.将流依次写入到zip文件中

 

private void zipFileList(String zipBasePath, String zipName, String zipFilePath, Map<String, Object>  filePaths,ZipOutputStream zos) throws IOException {
        InputStream in=(InputStream)filePaths.get("io");
        BufferedInputStream bis = new BufferedInputStream(in);  
        
        //将文件写入zip内,即将文件进行打包  
        zos.putNextEntry(new ZipEntry(filePaths.get("name").toString()));  //这里可以修改要写入到zip中文件的名称
        
        //写入文件的方法,同上                  
        int size = 0;  
        byte[] buffer = new byte[1024];  //设置读取数据缓存大小
        while ((size = bis.read(buffer)) > 0) {  
            zos.write(buffer, 0, size);  
        }  
        //关闭输入输出流  
        zos.closeEntry();  
        bis.close(); 
         
    } 

7.调用浏览器下载

public void template(HttpServletResponse response ,String downLoadPath){
        try {
            String fileName=downLoadPath.substring(downLoadPath.lastIndexOf("/")+1);
            byte[] buffer=null;  
            buffer =downFileByte(downLoadPath) ; 
            String fileSuffixName=   fileName.substring(fileName.lastIndexOf(".")+1);
            response.reset(); //清除缓存
            response.setContentType("application/" +fileSuffixName + ";" +"charset = UTF-8"); //设置字符集和文件后缀名
            String name=id.nextId()+"";
            name = new String(name.getBytes(), "ISO-8859-1");
            response.setHeader("Content-Disposition","attachment; filename=" +name+"."+fileSuffixName); // 设置文件名称
            OutputStream toClient = new BufferedOutputStream(response.getOutputStream());  
            toClient.write(buffer);  
            toClient.flush();  
            toClient.close();
        } catch (Exception e) {
            e.printStackTrace();
            Log4jUtil.getLog4jUtil().error("下载zip文件异常"+e.getMessage());
        }
    }

8.工具类

public static byte[] downFileByte(String downLoadPath) throws Exception{  
        byte[] return_arraybyte=null;  
        InputStream ins=new FileInputStream(downLoadPath );  
        ByteArrayOutputStream byteOut = new ByteArrayOutputStream();  
        byte[] buf = new byte[1024];  
        int bufsize = 0;  
        while ((bufsize = ins.read(buf, 0, buf.length)) != -1) {  
            byteOut.write(buf, 0, bufsize);  
        }  
        return_arraybyte = byteOut.toByteArray();  
        byteOut.close();  
        ins.close();  
    return return_arraybyte;  
    }

 

感觉可以用到的连接:

code码:https://blog.csdn.net/jinhao2003/article/details/2141378

ftp主被动连接:https://www.cnblogs.com/huhaoshida/p/5412615.html 

in.close坑解释连接:https://www.e-learn.cn/content/java/758171

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ftp服务器批量下载文件之retrieveFileStream (方式一) 的相关文章

  • apache-commons ftp 检索多个文件

    我正在尝试使用 apache commons net FTP lib 从 FTP 服务器获取数据 如果目录中只有 1 个文件 该代码可以正常工作 但在我第二次调用retrieveFileStream 时始终返回 null 有什么想法吗 我编
  • PHP ftp_put 返回“无法建立数据连接:连接被拒绝”

    我有一台通过 PHP 运行一些 FTP 的 PC 我知道它在 1 2 个月前还可以工作 但现在我返回它 发现该 PC 不再工作了 我知道我一直在使用电脑 但我想不出可能会发生什么变化 PHP 抛出错误消息读取 无法建立数据连接 连接被拒绝
  • 使用python连接ftp服务器

    我尝试使用 python 代码连接到手机中的 ftp 服务器 但出现错误 Code import ftplib server ftplib FTP server connect 192 168 135 101 5556 server log
  • Ftp 仅在 .NET 4.0 中抛出 WebException

    我有以下 C 代码 当针对 NET Framework 3 5 或 2 0 编译时 它运行得很好 我没有针对 3 0 进行测试 但它很可能也能工作 问题是 当针对 NET Framework 4 0 构建时它会失败 FtpWebReques
  • 如何列出 FTP 连接的目录内容

    我找不到这方面的教程 在 VB NET 中我想要执行如下命令 Dim array1 as string ListFilesInFolder www example com images 我知道这可能不会那么简单 但是有人可以给我指点教程或其
  • FTP 传入监控(上传时)

    我们有大约 100 个用户通过 FTP 登录并上传文件 我们的在线系统 PHP 应该显示刚刚上传的项目 我不想继续检查所有不同的 FTP 文件夹来检查新文件 在不降低服务器速度的情况下 使用 PHP 检查新文件的最佳方法是什么 所有用户都在
  • 在 FTP 上上传多个文件

    我是 Objective C 和 iOS 的新手 我正在使用 SimpleFTPSample 制作用于将文件上传和下载到 ftp 的测试应用程序 我需要在 ftp 上上传两个文件 但在 SimpleFTPSample 中您只能上传一个 那么
  • php ftp 建立多个目录

    这是我的 PHP 代码 它实际上工作得很好 newftpdir parent date Ymd YYYYMMDD newftpdir child ext folder username newftpdir newftpdir parent
  • 是否可以通过 FTP 代理使用 C# FtpWebRequest?

    据我了解 FtpWebRequest Proxy属性表示 HTTP 代理 我必须通过 FTP 代理向外部服务器发出 FTP 请求 到目前为止 我实现此功能的唯一方法是创建一个使用 Windows FTP 命令的脚本并以这种方式下载 是否可以
  • 使用.net 2.0 连接到 FTP 服务器 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我希望连接到现有的 FTP 服务器 上传文件 等待服务器生成报告 然后将该报告下载回 VB NET 2
  • 如何通过FTP将多个多级(不同层次)文件从本地版本覆盖到在线版本

    我只是在本地更改了几个不同目录中的许多文件 然后将更改推送到 Subversion 但这不会更改实时版本 只会更改存储库 现在我必须通过 FTP 更新这些文件 但它们都是不同的层次结构级别 我怎么做 我知道的唯一方法是采用我的整个本地版本并
  • 如何使用 FTP 在目录之间移动文件?

    我有一个程序需要将文件从 FTP 服务器上的一个目录移动到另一个目录 例如 该文件位于 ftp 1 1 1 1 MAIN Dir1 我需要将文件移动到 ftp 1 1 1 1 MAIN Dir2 我发现了几篇推荐使用 重命名 命令的文章 因
  • 没有人拥有者(99 99)在FTP中由php功能引起?

    我有一个脚本 Joomla 可以在服务器上创建文件和目录 问题是它在所有者 99 99 无人 下创建它们 并且在没有服务器管理员帮助的情况下我无法通过 FTP 删除或修改它们 我认为那是move uploaded filephp 的函数 W
  • 考虑到每次轮询最大消息数和 Cron,轮询如何用于 FTP 入站通道适配器

    我有 UC 我需要从 ftp 位置选取文件并将其放入服务器位置 我正在使用 ftp inbound channel adapter Spring 集成 2 0 4 来实现它 下面是我的xml中的配置
  • FTPWebRequest .NET 3.5 与 4

    我有一个应用程序可以与 IBM 大型机建立 FTP 连接 并且一切都工作正常 然后 我针对 NET 4 重新编译 主机不再接受该文件 并给出一条错误消息 指出该文件不存在 或者我没有该文件的权限 这是我用来发送文件的 Ftp FtpWebR
  • 使用PHP通过FTP递归扫描目录和子目录

    我正在尝试创建目录中所有文件 及其大小 的列表 包括子目录中的所有内容 这些文件位于远程服务器上 所以我的脚本通过 FTP 连接 然后使用以下命令运行递归函数ftp chdir浏览每个目录 如果有其他方法可以做到这一点 我愿意接受建议 fl
  • 如何从 Visual Studio Online 在 FTP 上部署工件?

    我已经在 Visual Studio Online 上设置了自动构建 并且能够在构建下获取工件 现在我想在 FTP 上部署工件 由于我的网站托管在 GoDaddy 上 并且他们为我提供了 FTP 帐户 任何人都可以帮我设置此帐户吗 这可以通
  • C# 单文件FTP下载

    我试图在 C 控制台应用程序中使用 FTP 下载文件 但即使我知道路径是正确的 我总是收到错误消息 550 file not found 有什么方法可以返回当前路径 一旦连接到服务器 lade datei von FTP server st
  • 使用 PowerShell 在 IIS FTP 站点上设置权限和设置

    我是 PowerShell 的初学者 我尝试了这个脚本并且运行良好 但我需要将 FTP 授权规则更改为 所有用户 读 写 并将 FTP 用户隔离 更改为 用户名目录 NEEDED FOR IIS CMDLETS Import Module
  • 向 FTP 服务器执行跨域 XMLHTTPREQUEST 的语法是什么?

    我有一个 webDav CORS 插件 可以使用它在 webDav 服务器上 POST PUT GET REMOVE ALLDOCS 文件 我现在想对 FTP 做同样的事情 但我正在努力获取xmlhttprequest 工作语法 我只是收到

随机推荐