2

FTP経由で大量の画像をサーバーにアップロードするgrailsアプリがあります。そのために、commons-net を使用しています。奇妙なことに、ファイルごとに新しい接続を作成すると正常に動作しますが、一度接続してからファイルの送信を開始すると、ファイルが破損してしまいます! 以下は私のコードです。これは機能しますが、ファイルごとに新しい接続を作成したくありません。

    filesList.each{ f->

        String ftpUser = ConfigurationHolder.config.ftp.user
        String ftpPassword = ConfigurationHolder.config.ftp.password
        String ftpHost = ConfigurationHolder.config.ftp.host

        log.debug "ftp> ${ftpUser}@${ftpHost}"

        JakartaFtpWrapper ftp = new JakartaFtpWrapper();
        ftp.connectAndLogin(ftpHost, ftpUser, ftpPassword)
        ftp.setDataTimeout(1000*60*60*5)
        log.debug "Welcome message[${ftp.getReplyString()}]"
        log.debug "Current Directory[${ftp.printWorkingDirectory()}]";

        log.debug "remote dir[${remoteDir}]"
        ftp.makeDirectory(remoteDir)
        ftp.cwd(remoteDir)


        log.debug "uploading file path[${f}]..."
        ftp.binary()
        ftp.enterLocalPassiveMode()


        def input  = new FileInputStream(f.getAbsolutePath());
        OutputStream output = ftp.storeFileStream(f.getName())

        Util.copyStream(input, output);

        output.flush()
        input.close();
        output.close();

        ftp.logout();
        ftp.disconnect();
    }

それぞれから接続を削除すると、画像が破損しました! 私はここで何か間違っていますか?

編集**:これは機能しません:

    String ftpUser = ConfigurationHolder.config.malibu.ftp.user
    String ftpPassword = ConfigurationHolder.config.malibu.ftp.password
    String ftpHost = ConfigurationHolder.config.malibu.ftp.host

    log.debug "ftp> ${ftpUser}@${ftpHost}"

    JakartaFtpWrapper ftp = new JakartaFtpWrapper();
    ftp.connectAndLogin(ftpHost, ftpUser, ftpPassword)
    ftp.setDataTimeout(1000*60*60*5)
    log.debug "Welcome message[${ftp.getReplyString()}]"
    log.debug "Current Directory[${ftp.printWorkingDirectory()}]";

    log.debug "remote dir[${remoteDir}]"
    ftp.makeDirectory(remoteDir)
    ftp.cwd(remoteDir)

    filesList.each{ f->
        log.debug "uploading file path[${f}]..."
        ftp.binary()
        ftp.enterLocalPassiveMode()

        def input  = new FileInputStream(f.getAbsolutePath());
        OutputStream output = ftp.storeFileStream(f.getName())

        Util.copyStream(input, output);

        output.flush()
        input.close();
        output.close();
    }

    ftp.logout();
    ftp.disconnect();

編集

JakartaFtpWrapper のリンク: http://www.nsftools.com/tips/JakartaFtpWrapper.java

編集2

私はすでに ftp.binary() を内側、ループ、または外側に追加しようとしました。どちらも機能しません。

1 つの興味深い考えは、常に最後の写真が ftp サーバーで正しく取得されているということです。最初の写真は最後の写真よりも破損しているようです!

4

3 に答える 3

5

JakartaFtpWrapper のオプションを ascii ではなくバイナリ モードで転送するように設定してみてください。

関連する質問から: JakartaFtpWrapper を使用した Java アップロード jpg - ファイルを読み取れなくする

于 2011-06-14T21:36:35.660 に答える
1

考えられる提案が 2 つあります。

最初に、各ストリームをコピーした後にftp.completePendingCommand()を呼び出して、次の転送を試行する前に終了するかどうかを確認することができます。(これはおそらく、実際に役立つ私の提案の可能性が高いです)

私が考えていたもう1つのことはoutput.flush()、通常これが呼び出されるコマンドを削除することoutput.close()ですが、正直なところ、これが事実であることが判明した場合、私は非常に驚くでしょう.

お役に立てれば!

于 2011-07-11T19:22:31.890 に答える
0

これは私がしていることであり、私にとってはうまくいきます:

OutputStream output;

output = new FileOutputStream(localDirectory);

//get the file from the remote system
ftp.setFileType(FTP.BINARY_FILE_TYPE);
ftp.setFileTransferMode(FTP.BINARY_FILE_TYPE);
ftp.retrieveFile(file.getName(), output);

//close output stream
output.flush();
output.close();

重要なことはFileType、正しいタイプでを設定することFTP.BINARY_FILE_TYPEです。FTP.IMAGE_FILE_TYPE

于 2013-03-15T00:52:54.710 に答える