为什么java ftp上传文件损坏到服务器?

时间:2012-03-01 13:56:35

标签: java upload ftp ftp-client apache-commons-net

我正在尝试将文件(config.zip.zip和artikels.csv)从我的Java应用程序传输到程序运行的FTP服务器,文件被传输,但是当我在文件夹中打开它时,文件已损坏,文件大小小于原始文件大小。 artikels.csv文件有较少的行然后orignal 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();
        }
    }
}

2 个答案:

答案 0 :(得分: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();
    ...

答案 1 :(得分:0)

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

由于您要遍历许多文件,因此需要在每个文件之后关闭FileInputStream