FTPClient下载文件0kb问题

Posted 语海

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FTPClient下载文件0kb问题相关的知识,希望对你有一定的参考价值。

困扰了2天的问题终于解决

错误代码

/**
    * @Description: 从ftp服务器下载文件到指定输出流
    * @param remotePath,fileName,outputStream FTP服务器上的相对路径,文件名,输出流
    * @return 布尔值 成功返回true,异常返回false
    * @author Beyond
    * @date 2021/6/5 14:34
    */
    public static boolean downloadFile(String remotePath, String fileName, OutputStream outputStream) {
        boolean result = false;
        try {
            if (initFtpClient()){
                return false;
            }
            // 转移到FTP服务器目录
            ftp.changeWorkingDirectory(remotePath);
            // 通知服务器开通给一个端口,防止挂死
            ftp.enterLocalPassiveMode();
            // 取得指定文件夹下文件列表
            FTPFile[] fs = ftp.listFiles();
            for (FTPFile ff : fs) {
                // 取得指定文件并下载
                if (ff.getName().equals(fileName)) {
                    ftp.enterLocalPassiveMode();
                    ftp.retrieveFile(remotePath+"/"+fileName,outputStream);
                    result = true;
                }
            }
            ftp.logout();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (IOException ioe) {
                    ioe.printStackTrace();
                }
            }
        }
        return result;
    }

错误原因
image
修正后代码

/**
    * @Description: 从ftp服务器下载文件到指定输出流
    * @param remotePath,fileName,outputStream FTP服务器上的相对路径,文件名,输出流
    * @return 布尔值 成功返回true,异常返回false
    * @author Beyond
    * @date 2021/6/5 14:34
    */
    public static boolean downloadFile(String remotePath, String fileName, OutputStream outputStream) {
        boolean result = false;
        try {
            if (initFtpClient()){
                return false;
            }
            // 转移到FTP服务器目录
            ftp.changeWorkingDirectory(remotePath);
            // 通知服务器开通给一个端口,防止挂死
            ftp.enterLocalPassiveMode();
            // 取得指定文件夹下文件列表
            FTPFile[] fs = ftp.listFiles();
            for (FTPFile ff : fs) {
                // 取得指定文件并下载
                if (ff.getName().equals(fileName)) {
                    ftp.enterLocalPassiveMode();
                    ftp.retrieveFile(
                            new String(fileName.getBytes(StandardCharsets.UTF_8),StandardCharsets.ISO_8859_1),
                            outputStream);
                    result = true;
                }
            }
            ftp.logout();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (IOException ioe) {
                    ioe.printStackTrace();
                }
            }
        }
        return result;
    }

附图显示成功后结果
image
image

以上是关于FTPClient下载文件0kb问题的主要内容,如果未能解决你的问题,请参考以下文章

org.apache.commons.net.ftp.FTPClient下载中文文件夹乱码如何处理?

FtpClient

C++ 下载文件 WinInet - 0kb 写入文件

通用类库-FTPClient帮助类,实现文件上传,目录操作,下载等动作

FtpClient下载文件时文件大小为0

Java FTPClient实现文件上传下载