首页 > 其他分享 >读取FTP文件,并打包成压缩包下载

读取FTP文件,并打包成压缩包下载

时间:2023-06-07 10:03:30浏览次数:41  
标签:FTP 读取 ftp param FTPClient import ftpClient 压缩包


import java.io.*;
import java.net.SocketException;
import java.net.URLEncoder;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;


public class FtpFileUtil {

 
/**
 * 获取FTPClient对象
 * @param ftpAddress FTP主机服务器地址
 * @param ftpHost 端口号
 * @param ftpUsername 用户名
 * @param ftpPassword 密码
 * @return FTPClient对象
 */
public static FTPClient getFTPClient(String ftpAddress, int ftpHost, String ftpUsername, String ftpPassword) {
    FTPClient ftpClient = new FTPClient();
    try {
        ftpClient.setDataTimeout(60000);       //设置传输超时时间为60秒
        ftpClient.setConnectTimeout(60000);
        ftpClient.connect(ftpAddress, ftpHost);// 连接FTP服务器
        ftpClient.login(ftpUsername, ftpPassword);// 登陆FTP服务器
        if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
            logger.info("未连接到FTP,用户名或密码错误。");
            ftpClient.disconnect();
        } else {
            logger.info("FTP连接成功。");
        }
    } catch (SocketException e) {
        e.printStackTrace();
        logger.info("FTP的IP地址可能错误,请正确配置。");
    } catch (IOException e) {
        e.printStackTrace();
        logger.info("FTP的端口错误,请正确配置。");
    }
    return ftpClient;
}


/**
 *实现文件打包压缩下载
 * @param FTP_ADDRESS
 * @param FTP_PORT
 * @param FTP_USERNAME
 * @param FTP_PASSWORD
 * @param response  服务器响应对象HttpServletResponse
 * @param zipname 压缩包的文件名
 * @param ftpPath ftp文件路径
 * @param ftpFileList 要下载的文件名集合
 * @param namelist 压缩后的文件名集合
 */
public static void zipDownloadFile(String FTP_ADDRESS,int FTP_PORT,String FTP_USERNAME,String FTP_PASSWORD,HttpServletResponse response, String zipname, String ftpPath,List<String>ftpFileList, List<String> namelist) {
    FTPClient ftp = getFTPClient(FTP_ADDRESS, FTP_PORT, FTP_USERNAME, FTP_PASSWORD);
    byte[] buf = new byte[1024];
    try {
        ftp.setControlEncoding("UTF-8");
        ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
        ftp.enterLocalPassiveMode();
        ftp.changeWorkingDirectory(ftpPath);
        File zipFile = new File("123");
        ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFile));
        for (int i=0;i< ftpFileList.size();i++) {
            ZipEntry entry = new ZipEntry((i+1)+"_"+namelist.get(i));
            zipOut.putNextEntry(entry);
            InputStream bis = ftp.retrieveFileStream(ftpFileList.get(i));
            if (bis != null) {
                int readLen = -1;
                while ((readLen = bis.read(buf, 0, 1024)) != -1) {
                    zipOut.write(buf, 0, readLen);
                }
                zipOut.closeEntry();
                bis.close();
                ftp.completePendingCommand();
                //调用ftp.retrieveFileStream这个接口后,一定要手动close掉返回的InputStream,然后再调用completePendingCommand方法
                // ,若不是按照这个顺序,则会导致后面对FTPClient的操作都失败
            }
        }
        zipOut.close();
        ftp.logout();
        //下载
        int len;
        FileInputStream zipInput =new FileInputStream(zipFile);
        OutputStream out = response.getOutputStream();
        response.setContentType("application/octet-stream");
        response.addHeader("Content-Disposition", "attachment; filename="
                + URLEncoder.encode(zipname, "UTF-8") + ".zip");
        while ((len=zipInput.read(buf))!= -1){
            out.write(buf,0,len);
        }
        zipInput.close();
        out.flush();
        out.close();
                    //删除压缩包
        zipFile.delete();
    } catch (Exception e) {
        logger.error("文件打包下载有误: " + e.getLocalizedMessage());
        e.printStackTrace();
    }
}
 
}

标签:FTP,读取,ftp,param,FTPClient,import,ftpClient,压缩包
From: https://blog.51cto.com/u_15564034/6429984

相关文章

  • Python写文件时加锁,避免写入过程中被读取
    问题:Linux上有个Python2脚本每天定时生成一些数据,并覆盖写入文件A,文件内容是每行一个Json字符串。有一个乙方的采集器程序(类似filebeat)需要读取文件A,但发现读取的数据有截断,导致解析失败。怀疑是因为采集器读取文件A的时候,文件A写入还未结束。解决:由于采集器程序是乙方自研的,属......
  • C# 读取txt文本数据
    publicstaticList<string>GetTxtInfo(stringFilePath,refstringerrMsg){List<string>result=newList<string>();stringpath=FilePath;if(File.Exists(path)){File......
  • fluent读取网格文件报错:eof inside list是什么意思,怎么解决?
    做好二维网格之后,导入fluent中网格文件,发现报错:eofinsidelisteofinsidelist这个一般是指格式出错,应该是网格中的一些问题,可以检查一遍网格,尤其是对于边界条件的定义方面,我检查了一遍发现是网格边界在命名的时候出现了非法字符:;,重新修改名称之后就没有问题了。......
  • 引出问题:不同编码读取会出现乱码
         ......
  • 不能直接从jar 读取文件
    Whatisafile?https://www.computerhope.com/jargon/f/file.htm文件的权限delete,execute,read,write,readlinkabc.jar是一个fileabc.jar!\test.xml不是一个file,因为在电脑上不能用ls或dir将它显示出来。它是文件的内容的一部分,是二进制流。测试项目一z-bean.......
  • “AI Earth”人工智能创新挑战赛:助力精准气象和海洋预测Baseline[1]、NetCDF4使用教学
    1.“AIEarth”人工智能创新挑战赛:助力精准气象和海洋预测Baseline[1]、NetCDF4使用教学、Xarray使用教学,针对气象领域.nc文件读取处理比赛官网:https://tianchi.aliyun.com/specials/promotion/aiearth2021?spm=a2c22.12281976.0.0.4d0d19efK2FngK1.1背景描述聚焦全球大气海......
  • python操作Excel,读取表格内容,并根据需求将内容填充到表格指定位置
    在日常工作中经常会遇到需要将“表一,部门信息表”内容逐行填充到“表二,个人基本信息表”的情况。表一:表二:  实现方式如下:#!usr/bin/python#-*-coding:utf-8-*-importpandasaspdimportopenpyxlasopfromopenpyxlimportWorkbookfromopenpyxlimportl......
  • 打包Jar后的文件读取
    对于org.springframework.core.io.ClassPathResource本地环境时,使用方法 getFile(),可以正常读取文件,但打成Jar后,读取失败,其主要原因是:在jar里,返回的是一个Jar协议地址:jar:file:/xxx/xx.jar!/xxxx而getFile方法的实现为publicstaticFilegetFile(URLresourceUrl,St......
  • IO流:文件字节输入流-每次读取一个字节
        ......
  • c语言基于链表的文件存储与读取
    今天写了一下如何将链表中的数据存储到文件中head为链表的起始结点写入文件voidfilewirte(LinkListhead){LinkListfd;FILE*p=fopen("student_grad.txt","w");if(p==NULL){printf("没有东西");getchar();exit(1);}fd=head......