java下载远程FTP文件至本地

代码块

例如:


public Map<String, Object> downloadFileFromFTP(){
    Map<String, Object> data = new HashMap<>();

    //获取项目在tomcat部署的路径
    String nodepath = this.getClass().getClassLoader().getResource("/").getPath();
    String filePath = nodepath.substring(1, nodepath.length() - 17); 

    //通过ftpAddress、ftpName和ftpPassword连接ftp
    FTPClient ftpClient = new FTPClient();
    ftpClient.connect(ftpAddress);
    boolean isLogin = ftpClient.login(ftpName, ftpPassword);
    //如果连接成功则继续执行
    if(isLogin){
        try {
            //调用FTPClient.enterLocalPassiveMode();这个方法的意思就是每次数据连接之前,
            //ftp client告诉ftp server开通一个端口来传输数据。为什么要这样做呢,因为ftp server
            //可能每次开启不同的端口来传输数据,但是在linux上,由于安全限制,可能某些端口没有开启,
            //所以就出现阻塞。
            ftpClient.enterLocalPassiveMode();
            //ftpFilePath为所需下载文件在远程FTP服务器根目录中的路径
            //fs为ftpFilePath下所有文件集合
            FTPFile[] fs = ftpClient.listFiles(ftpFilePath);     
            for(FTPFile ff:fs){ 
                String f= new String(ff.getName().getBytes("iso-8859-1"), "utf-8");
                //name为所需下载文件名
                if(f.equals(name + ".mp4")){  
                    //将视频名返回前端界面
                    data.put("videoName",f);
                    //该语句仅仅是在本地TOMCAT服务器指定路径创建了一个对象
                    File localFile = new File(filePath + "/temp/video/" + f); 
                    //如果所创建对象已经存在,则直接跳过,否则执行
                    if(!localFile.exists()){
                        //如果文件不存在,则从远程FTP下载,并存储至本地指定路径
                        OutputStream is = new FileOutputStream(localFile);  
                        //设置下载文件相对远程FTP根目录所处的路径 
                        ftpClient.changeWorkingDirectory(path); 
                        //FTPClient是经常用到的ftp第三方开发包。但是其默认的编码方式是基于“ISO-8859-1”的。
                        //因此对文件名含有中文的文件会下载失败,将文件名转换为ISO-8859-1
                        Boolean b = ftpClient.retrieveFile(ff.getName(), is);       
                        is.close(); 
                    } 
                    break;
                }    
            }    
            ftpClient.logout();  
        } catch (IOException e) {  
            e.printStackTrace();    
        } finally {    
            if (ftpClient.isConnected()) {   
                try {    
                    ftpClient.disconnect();    
                } catch (IOException ioe) {    
                }    
            }    
        }
    }
    return data;
}

开发环境客户端是在windows下tomcat的一个web应用 ; 部署环境是在 linux 下的tomcat的一个web应用。由ftpclient从ftp服务器上取得的文件。在开发环境运行正常(windows),但部署后(linux),发现所下载文件都无法打开。经过对比发现存在字节缺失的情况 。原因如:
windows的回车换行时:/r/n
linux的回车换行是:/n
因此在开始下载文件前设置传输类型:

ftpClient.changeWorkingDirectory(ftpPath);
ftpClient.setFileType(FTP.BINARY_FILE_TYPE); 
Boolean b = ftpClient.retrieveFile(ff.getName(), is); 
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值