ftp正在破坏我的图像!

时间:2011-06-14 21:10:52

标签: java grails ftp apache-commons-net

我有一个grails应用程序,它应该通过FTP将一堆图像上传到服务器。要做到这一点,我使用commons-net。奇怪的是,如果我为每个文件创建一个新的连接它正常工作,但如果我连接一次然后开始发送文件,文件就会被破坏! bellow是我的代码,它有效,但我不想为每个文件创建一个新的连接:

    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服务器中正确,似乎第一张照片比最后一张照片更糟糕了!

3 个答案:

答案 0 :(得分:4)

尝试在JakartaFtpWrapper中设置选项,以二进制模式而不是ascii进行传输。

来自相关问题:Java upload jpg using JakartaFtpWrapper - makes the file unreadable

答案 1 :(得分:1)

我有两个可能的建议。

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

我想的另一件事就是删除output.flush()命令,因为通常会在output.close()中调用它,但老实说如果情况确实如此,我会非常惊讶。

希望这有帮助!

答案 2 :(得分: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