ftp没有在java中正确下载文件?

当我使用以下代码下载文件时,它只是将文件写入本地目标,但文件大小都为零。 任何人都可以说为什么会发生这种情况以及如何解决它?

import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; import java.io.FileOutputStream; import java.io.IOException; public class FtpDownload { public static void main(String[] args) { FTPClient client = new FTPClient(); FileOutputStream fos = null; String filename = "config.zip"; try { client.connect("ftpsrv"); client.login("user", "user"); for (FTPFile file : client.listFiles()) { filename = "C:\\tmp\\user\\" + file.getName(); if (file.isFile()) { fos = new FileOutputStream(filename); client.retrieveFile(filename, fos); System.out.println(file.getName()); } else if (file.isDirectory()) { System.out.println("directory: " + file.getName()); } } } catch (IOException e) { e.printStackTrace(); } finally { try { if (fos != null) { fos.close(); } client.disconnect(); } catch (IOException e) { e.printStackTrace(); } } } } 

在Apache文档中搜索后,我得出结论BINARY_FILE_TYPE尚未解决。 我添加了以下代码,一切正常。 感谢所有帮助过你的人。

 try { client.connect(ftpServer); client.login(username, password); // following line fixed my zip file corruption issue. client.setFileType(FTP.BINARY_FILE_TYPE); 

您正在使用本地路径变量指向远程文件:

 filename = "C:\\tmp\\user\\" + file.getName(); ... client.retrieveFile(filename, fos); 

您想要指向远程文件,而不是本地目标,如下所示:

 client.retrieveFile(file.getName(), fos); 

此外,请确保在阅读每个文件后关闭fos流,而不是在最后。 你可以使用IOUtils.closeQuietly(fos); 如果你得到了commons.io库,它可以避免嵌套的try-catch块。

您还应该使用BINARY文件类型和BLOCK传输模式来传输zip文件:

 client.setFileTransferMode(FTPClient.BLOCK_TRANSFER_MODE); client.setFileType(FTPClient.BINARY_FILE_TYPE); 

尝试在循环中的每次迭代中关闭流

 fos.close(); 

您的代码没有正确执行,因为您有一个for循环,每次迭代都会创建新流但只关闭最后一个