1

我正在尝试将文件(config.zip.zip 和 artikels.csv)从我的 Java 应用程序传输到 FTP 服务器,程序运行,文件被传输,但是当我在文件夹中打开它时,文件是损坏,文件大小小于原始文件大小。artikels.csv 文件的行数少于原始 artikels.csv,但 zip 文件无法完全打开。为什么?我该如何解决这个问题?

import org.apache.commons.io.FilenameUtils;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;

public static void upload(List<String> files){
    FTPClient client = new FTPClient();
    FileInputStream fis = null;
    try {
        client.connect(ftpServer);
        client.login(username, password);
        client.setFileType(FTP.BINARY_FILE_TYPE);

        for(String filename:files){
            fis = new FileInputStream(filename);
            boolean uploadOk =  client.storeFile(FilenameUtils.getName(filename), fis);
            System.out.println("Uploading status is: "+uploadOk);
        }
            client.completePendingCommand();
            client.logout();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (fis != null) {
                fis.close();
            }
            client.disconnect();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
4

2 回答 2

1

这是您正在运行的确切代码吗?似乎怀疑 completePending Command() 和 logout() 在您的文件迭代循环中。你不应该有更多类似以下的东西吗?

    ...

    client.connect(ftpServer);
    client.login(username, password);
    client.setFileType(FTP.BINARY_FILE_TYPE);
    for(String filename:files){
        fis = new FileInputStream(filename);
        String s = FilenameUtils.getName(filename);
        System.out.println(s);
        boolean uploadOk = client.storeFile(s, fis);
        System.out.println("Uploading status is: "+uploadOk);
    }
    client.completePendingCommand();
    client.logout();
    ...
于 2012-03-01T14:12:44.743 回答
0

您需要fis.close()在循环中添加。

由于您正在循环浏览许多文件,因此您需要FileInputStream在每个文件之后关闭您的文件。

于 2015-09-27T03:27:55.200 回答