我有一个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服务器中正确,似乎第一张照片比最后一张照片更糟糕了!
答案 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_TYPE
或FTP.IMAGE_FILE_TYPE