FTP не загружает файл должным образом в Java? - PullRequest
7 голосов
/ 29 февраля 2012

Когда я загружаю файл с помощью следующего кода, он просто записывает файл в локальную папку назначения, но размер файла равен нулю. Кто-нибудь может сказать, почему это происходит и как это исправить?

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();
        }
    }

}
}

Ответы [ 3 ]

16 голосов
/ 01 марта 2012

после поиска в документации 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);
4 голосов
/ 29 февраля 2012

Вы используете локальную переменную path для указания на удаленный файл:

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);
1 голос
/ 29 февраля 2012

попробуйте закрыть поток на каждой итерации цикла

fos.close();

Ваш код делает это неправильно, потому что у вас есть цикл for, который создает новый поток на каждой итерации, но закрывает только последнюю

...