commons-net ftp загружает поврежденные файлы

Я пытаюсь использовать apache commons-net для передачи файлов ftp.

Проблема в том, что файлы периодически приходят на сервер коррумпированы. «коррумпированный» я имею в виду, что winrar говорит мне, что у zip-файла есть «неожиданный конец архива». иногда файлы полностью пусты. Я заметил, что это случается больше для больших файлов (более 100 КБ), но также и для небольших файлов (20 КБ).

Я точно знаю, что загружаемый исходный zip-файл действителен и составляет всего 243 КБ.

Я не получаю никаких ошибок / исключений из кода.

Вот код, который выполняется:

    try
    {
        int CON_TIMEOUT = (int) TimeUnit.SECONDS.toMillis(20); // fail if can't connect within 20 seconds
        int LIVE_TIMEOUT = (int) TimeUnit.MINUTES.toMillis(5); // allow up to 5 minutes for data transfers

        FTPClient client = new FTPClient();
        client.setConnectTimeout(CON_TIMEOUT);
        client.setDataTimeout(LIVE_TIMEOUT);
        client.connect(host);
        client.setSoTimeout(LIVE_TIMEOUT);
        client.login(user, pass);
        client.changeWorkingDirectory(dir);
        log("client ready");

        File file = new File(filePath);
        String name = new Date().getTime() + "-" + file.getName();

        InputStream fis = null;
        try
        {
            fis = new FileInputStream(file);
            if (!client.storeFile(name, fis))
                throw new RuntimeException("store failed");
            log("store " + name + " complete");
        }
        finally
        {
            IOUtils.closeQuietly(fis);
            try
            {
                client.logout();
                log("logout");
            }
            catch (Throwable e)
            {
                log("logout failed", e);
            }
            try
            {
                client.disconnect();
                log("disconnect");
            }
            catch (Throwable e)
            {
                log("disconnect failed", e);
            }
        }
    }
    catch (Throwable e)
    {
        log("transfer failed", e);
    }

и некоторые журналы:

2010-08-10 21:32:38 client ready
2010-08-10 21:32:49 store 1281439958234-file.zip complete
2010-08-10 21:32:49 logout
2010-08-10 21:32:49 disconnect
2010-08-10 21:32:50 client ready
2010-08-10 21:33:00 store 1281439970968-file.zip complete
2010-08-10 21:33:00 logout
2010-08-10 21:33:00 disconnect
2010-08-10 21:33:02 client ready
2010-08-10 21:33:11 store 1281439982234-file.zip complete
2010-08-10 21:33:11 logout
2010-08-10 21:33:11 disconnect
2010-08-10 21:33:15 client ready
2010-08-10 21:33:25 store 1281439995890-file.zip complete
2010-08-10 21:33:26 logout
2010-08-10 21:33:26 disconnect
2010-08-10 21:33:27 client ready
2010-08-10 21:33:36 store 1281440007531-file.zip complete
2010-08-10 21:33:36 logout
2010-08-10 21:33:36 disconnect
2010-08-10 21:33:37 client ready
2010-08-10 21:33:48 store 1281440017843-file.zip complete
2010-08-10 21:33:48 logout
2010-08-10 21:33:48 disconnect
2010-08-10 21:33:49 client ready
2010-08-10 21:33:59 store 1281440029781-file.zip complete
2010-08-10 21:33:59 logout
2010-08-10 21:33:59 disconnect
2010-08-10 21:34:00 client ready
2010-08-10 21:34:09 store 1281440040812-file.zip complete
2010-08-10 21:34:09 logout
2010-08-10 21:34:09 disconnect
2010-08-10 21:34:10 client ready
2010-08-10 21:34:23 store 1281440050859-file.zip complete
2010-08-10 21:34:24 logout
2010-08-10 21:34:24 disconnect
2010-08-10 21:34:25 client ready
2010-08-10 21:34:35 store 1281440065421-file.zip complete
2010-08-10 21:34:35 logout
2010-08-10 21:34:35 disconnect

обратите внимание, что все они были завершены в течение 15 секунд, и все полученные файлы на Сервер поврежден.

Я также проверил без установки таймаутов, и проблема все еще возникает.

6
задан skaffman 18 May 2012 в 15:24
поделиться

1 ответ

По умолчанию FTP использует типы файлов ascii. Вы хотите установить для него значение Binary при работе с двоичными данными, такими как zip-файл.

Из http://commons.apache.org/net/api/org/apache/commons/net/ftp/FTPClient.html

По умолчанию FTPClient настроен на использование FTP.ASCII_FILE_TYPE , FTP.NON_PRINT_TEXT_FORMAT, FTP.STREAM_TRANSFER_MODE и FTP.FILE_STRUCTURE. Непосредственно поддерживаются только типы файлов: FTP.ASCII_FILE_TYPE и FTP.BINARY_FILE_TYPE.

вы хотите выполнить setFileType (FTP.BINARY_FILE_TYPE) перед отправкой файла.

16
ответ дан 8 December 2019 в 14:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: