在 java 中使用 ftp 下载时文件已损坏
Files are getting corrupted when download using ftp in java
当我尝试提取压缩文件时,文件已损坏。这是我使用的代码。我无法理解我出了什么问题。文件格式为.zip,里面有XML个文件。从远程服务器下载后,XML 文件标签已更改且看起来已损坏。
public Boolean pullConfirmationsFTP(String host, String sftpUserName, String sftpPwd,
String sftpPort, String fromConfirmationDirectory, String archiveConfirmationDirectory,
String toDirectory) {
try {
// new ftp client
FTPClient ftp = new FTPClient();
// try to connect
ftp.connect(host);
// login to server
if (!ftp.login(sftpUserName, sftpPwd)) {
ftp.logout();
LOG4J.error("Authentication failed");
}
int reply = ftp.getReplyCode();
// FTPReply stores a set of constants for FTP reply codes.
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
}
// enter passive mode
ftp.enterLocalPassiveMode();
// get system name
// System.out.println("Remote system is " + ftp.getSystemType());
// change current directory
ftp.changeWorkingDirectory(fromConfirmationDirectory);
System.out.println("Current directory is " + ftp.printWorkingDirectory());
// get list of filenames
FTPFile[] ftpFiles = ftp.listFiles();
if (ftpFiles != null && ftpFiles.length > 0) {
// loop thru files
for (FTPFile file : ftpFiles) {
try{
if (!file.isFile()) {
continue;
}
LOG4J.error("File is " + file.getName());
// get output stream
OutputStream output;
output = new FileOutputStream(toDirectory + file.getName());
// get the file from the remote system
ftp.retrieveFile(file.getName(), output);
// close output stream
output.close();
// delete the file
ftp.deleteFile(file.getName());
}
catch(Exception e)
{
LOG4J.error("Error in pushing file : ",e);
}
}
}
ftp.logout();
ftp.disconnect();
} catch (Exception ex) {
ex.printStackTrace();
LOG4J.error(ex);
}
return true;
}
您没有说您使用的是哪个 FTPClient,但我猜它来自 apache commons。
FTPClient 的文档说:
The default settings for FTPClient are for it to use FTP.ASCII_FILE_TYPE , FTP.NON_PRINT_TEXT_FORMAT , FTP.STREAM_TRANSFER_MODE , and FTP.FILE_STRUCTURE . The only file types directly supported are FTP.ASCII_FILE_TYPE and FTP.BINARY_FILE_TYPE
由于 zip 文件是二进制文件,您必须添加
ftp.setFileType(FTP.BINARY_FILE_TYPE);
当我尝试提取压缩文件时,文件已损坏。这是我使用的代码。我无法理解我出了什么问题。文件格式为.zip,里面有XML个文件。从远程服务器下载后,XML 文件标签已更改且看起来已损坏。
public Boolean pullConfirmationsFTP(String host, String sftpUserName, String sftpPwd,
String sftpPort, String fromConfirmationDirectory, String archiveConfirmationDirectory,
String toDirectory) {
try {
// new ftp client
FTPClient ftp = new FTPClient();
// try to connect
ftp.connect(host);
// login to server
if (!ftp.login(sftpUserName, sftpPwd)) {
ftp.logout();
LOG4J.error("Authentication failed");
}
int reply = ftp.getReplyCode();
// FTPReply stores a set of constants for FTP reply codes.
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
}
// enter passive mode
ftp.enterLocalPassiveMode();
// get system name
// System.out.println("Remote system is " + ftp.getSystemType());
// change current directory
ftp.changeWorkingDirectory(fromConfirmationDirectory);
System.out.println("Current directory is " + ftp.printWorkingDirectory());
// get list of filenames
FTPFile[] ftpFiles = ftp.listFiles();
if (ftpFiles != null && ftpFiles.length > 0) {
// loop thru files
for (FTPFile file : ftpFiles) {
try{
if (!file.isFile()) {
continue;
}
LOG4J.error("File is " + file.getName());
// get output stream
OutputStream output;
output = new FileOutputStream(toDirectory + file.getName());
// get the file from the remote system
ftp.retrieveFile(file.getName(), output);
// close output stream
output.close();
// delete the file
ftp.deleteFile(file.getName());
}
catch(Exception e)
{
LOG4J.error("Error in pushing file : ",e);
}
}
}
ftp.logout();
ftp.disconnect();
} catch (Exception ex) {
ex.printStackTrace();
LOG4J.error(ex);
}
return true;
}
您没有说您使用的是哪个 FTPClient,但我猜它来自 apache commons。 FTPClient 的文档说:
The default settings for FTPClient are for it to use FTP.ASCII_FILE_TYPE , FTP.NON_PRINT_TEXT_FORMAT , FTP.STREAM_TRANSFER_MODE , and FTP.FILE_STRUCTURE . The only file types directly supported are FTP.ASCII_FILE_TYPE and FTP.BINARY_FILE_TYPE
由于 zip 文件是二进制文件,您必须添加
ftp.setFileType(FTP.BINARY_FILE_TYPE);