Почему FTP-файл Java загружает файл поврежден на сервер? - PullRequest
1 голос
/ 01 марта 2012

Я пытаюсь перенести файлы (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();
        }
    }
}

Ответы [ 2 ]

1 голос
/ 01 марта 2012

Это точный код, который вы используете?Кажется подозрительным, что команда completePending () и 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();
    ...
0 голосов
/ 27 сентября 2015

Вам нужно добавить fis.close() внутри вашего цикла.

Поскольку вы просматриваете много файлов, вам нужно закрыть FileInputStream после каждого.

...