Проблема с FTP-клиентом - PullRequest
       43

Проблема с FTP-клиентом

1 голос
/ 09 сентября 2011

Мне трудно что-то придумать. (Я довольно новичок во всем этом.) Я написал этот Java-PGM для FTP большого файла на целевой сервер. Вот код (коды были немного изменены для отображения):

public static void ftpUpload(String path, String upfileName, String dirName) throws Exception
{
    FTPClient client = new FTPClient();
    client.addProtocolCommandListener((ProtocolCommandListener) new PrintCommandListener(new PrintWriter(System.out)));
    client.enterLocalPassiveMode();

    FileInputStream fis = null;

    int reply;

    try {
        client.connect(ftpserver);
        client.login(ftpuserid, ftppasswd);
        reply = client.getReplyCode();

        if(FTPReply.isPositiveCompletion(reply)){
            client.changeWorkingDirectory(ftpdirectoryName + "/" + dirName);

            boolean mkDir = client.makeDirectory(getCurrentMMMYY().toLowerCase());

            client.changeWorkingDirectory(getCurrentMMMYY().toLowerCase());

              //Create an InputStream of the file to be uploaded
            fis = new FileInputStream(path + upfileName);

            //Store file to server
            client.storeFile(upfileName, fis);

        }    
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (fis != null) {
                fis.close();
            }
            client.logout();
            //client.disconnect();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

Что-то странное происходит с файлами, которые я отправляю ... Один из моих файлов на исходном сервере имеет размер 82575786, и когда я запускаю этот файл по ftp, он почти отправляет весь файл. На самом деле отправляет 82574867. (отсутствует 919) Другой файл на исходном сервере - 717885, и когда я запускаю этот файл, он почти полностью отправляет файл. На самом деле отправляет 717522. (отсутствует 363)

Я вытащил журнал, чтобы убедиться, что что-то не получилось, но с передачей ничего плохого Вот 2 записи журнала, показывающие перевод.

[08.09.11 20: 21: 13: 618 EDT] 00000043 SystemOut O 221-Вы передали 717522 байта в 1 файле. 221 - Вы передали 82574867 байт в 1 файле.

Любая помощь будет принята с благодарностью. Спасибо Dan.

Ответы [ 2 ]

3 голосов
/ 09 сентября 2011

Вы переводите в режиме ASCII вместо двоичного? Режим ASCII преобразует CR / LF в LF и наоборот в зависимости от настроек сервера и клиента.

Используете ли вы FTP-клиент Apache? Он говорит, что по умолчанию ASCII, вы можете попробовать установить BINARY_FILE_TYPE с setFileType :

client.setFileType(FTPClient.BINARY_FILE_TYPE);
1 голос
/ 19 октября 2011

Чтобы загрузить двоичный файл, вы должны использовать FTP.BINARY_FILE_TYPE, но этого недостаточно.

Вы используете только поток INPUT, и вам необходимо использовать и выходной поток

Я надеюсь, что этот пример поможет вам:

FTPClient client = new FTPClient();
client.connect("192.168.30.20");
client.login("pwd", "pwd");

client.setFileType(FTP.BINARY_FILE_TYPE);
String path_base = "/myPath/";
InputStream fis = new FileInputStream("A.pdf");
OutputStream os = client.storeFileStream(path_base+ "B.pdf");


byte buf[] = new byte[8192];
int bytesRead = fis.read(buf);
while (bytesRead != -1) {
   os.write(buf, 0, bytesRead);
   bytesRead = fis.read(buf);}

fis.close();
os.close();
client.completePendingCommand();
client.logout();
client.disconnect();
...