2

我有一个 grails 应用程序,它应该通过 FTP 将一堆图像上传到服务器。为此,我正在使用 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()。两者都不起作用。

一个有趣的想法是,总是最后一张照片在 ftp 服务器中是正确的,似乎第一张照片比最后一张更损坏!

4

3 回答 3

5

尝试将 JakartaFtpWrapper 中的选项设置为以二进制模式而不是 ascii 传输。

来自相关问题:Java upload jpg using JakartaFtpWrapper - 使文件不可读

于 2011-06-14T21:36:35.660 回答
1

我有两个可能的建议。

首先,您可以在复制每个流之后尝试调用ftp.completePendingCommand()以查看它是否在尝试下一次传输之前完成。(这可能是我的建议更有可能真正有帮助)

我在想的另一件事是删除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_TYPEFTP.IMAGE_FILE_TYPE

于 2013-03-15T00:52:54.710 回答