Ftp文件下载出现的跟种问题

1.解决fpt文件下载图片时失真的问题

参考链接:https://blog.csdn.net/truffle528/article/details/79551368

在用ftp将本地图片传输到服务器时发现图片被损坏,原因是使用了错误的传输类型使得源文件被修改了。

ftp有两种传输方式:二进制模式和ascll模式。

二进制模式是将文件直接传到服务器,不做任何改动。
ascll模式会将回车换行符修改为本机的回车换行符,会对源文件进行修改。比如windows的是‘\r\n’传送到unix会变成‘\n’。
基于这样的特性,在传输文本文件时我们通常使用ascll模式,而传输图片或者可执行文件时就需要切换为二进制模式。
        需要注意的是在使用ascll模式打开服务器上图片时也会显示错误,因为程序会将图片传送到本地的临时文件,再打开。这也相当于对源文件进行了修改,所以只对服务器上的图片进行查看也需要切换为二进制模式。

代码逻辑

    public static boolean downloadImage(String hostname, int port, String username, String password, String pathname, String filename, String localFileName, String localpath){
        
        boolean flag = false;
        FTPClient ftpClient = new FTPClient();
        try {
            //连接FTP服务器
            ftpClient.connect(hostname, port);
            //登录FTP服务器
            ftpClient.login(username, password);
            //设置文件类型
            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
            //设置linux ftp服务器
            FTPClientConfig conf = new FTPClientConfig( FTPClientConfig.SYST_UNIX);
            ftpClient.configure(conf);
            
            //验证FTP服务器是否登录成功
            int replyCode = ftpClient.getReplyCode();
            if(!FTPReply.isPositiveCompletion(replyCode)){
                System.out.println("登录失败");
                return flag;
            }
            
            //设置访问被动模式
            ftpClient.setRemoteVerificationEnabled(false);
            ftpClient.enterLocalPassiveMode();
            
            
            //切换FTP目录
            ftpClient.changeWorkingDirectory(pathname);
            
            OutputStream os = new FileOutputStream(localpath + "/" + localFileName);
            
            flag = ftpClient.retrieveFile(filename, os);
            
            os.close();
            ftpClient.logout();
            flag = true;
        } catch (Exception e) {
            e.printStackTrace();
        } finally{
            if(ftpClient.isConnected()){
                try {
                    ftpClient.logout();
                } catch (IOException e) {
                 
                }
            }
        }
        return flag;
    }
 

2.java实现FTP下载,解决假死的问题

参考链接:https://blog.csdn.net/ranger1911/article/details/41007363

前些日子一个小项目,需要使用java,通过FTP下载文件,之前没弄过,百度了一下,用高人提供的方法试了一下,果然能够顺利的连接FTP并下载,但很快,就发现了一个问题,在下载过程中,程序出现假死的现象,就是,既不报错,也不抛异常,还不终止,就是一直的跑啊跑啊的,每个头,自己研究了好长时间,也不知道怎么回事,后来上网又查了查,有人提出了一个方法,真心好用,在这里分享下:
在调用FTPClient.listFiles()或者FTPClient.retrieveFile()方法前,调用FTPClient.enterLocalPassiveMode()!
用人家的原话说,就是“这个方法的意思就是每次数据连接之前,ftp client告诉ftp server开通一个端口来传输数据。”说实话这是什么意思,我这个水平还不是很懂,望大家指教,现把FTP相关代码贴出来,与大家共享。

//创建FTP连接
ftpClient.setDefaultPort(//FTP端口号);

ftpClient.connect(//FTP服务IP地址); 
ftpClient.login(//FTP用户名, //密码); 
ftpClient.setBufferSize(1024); 
//设置文件类型(二进制) 
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
//每次数据连接之前,ftp client告诉ftp server开通一个端口来传输数据
ftpClient.enterLocalPassiveMode();

//从FTP下载文件
boolean b = ftpClient.retrieveFile(//FTP文件路径及文件名, //用以保存文件的文件输出流); 
 

你可能感兴趣的:(ftp)