1
我想使用Ruby的Net :: FTP类来存储二进制文件。该文件的内容由前一个进程放入管道中。我需要从管道(IO类)获取字节并将其存储(在/不需要临时文件)到FTP服务器。Ruby Net :: FTP storbinary从管道输入中写入受损文件
如果我这样做,这样
ftp = Net::FTP.new(@@host, @@user, @@password)
ftp.debug_mode = true
ftp.passive = true
ftp.binary = true
ftp.storbinary("STOR #{name}", pipe, Net::FTP::DEFAULT_BLOCKSIZE)
ftp.close
存储的文件的大小约为500KB小于它应该是(正确的尺寸是约6.8 MB)。该文件包含gpg加密数据。如果试图解密,我会得到一个错误。
直接从管道存储到本地文件会导致文件的大小和正常工作解密。
我是比较新的红宝石,有人可以给我一个提示吗?调试的一些想法?我可以提供更多信息吗?
感谢您的帮助
从网:: FTP输出调试:
put: PASV
get: 227 Entering Passive Mode (80,237,136,162,233,60).
put: STOR test-ftp.tar.gz.gpg
get: 150 Opening BINARY mode data connection for test-ftp.tar.gz.gpg
get: 226 Transfer complete
红宝石版本:红宝石2.1.5p273
操作系统:Linux的Debian的
环境:红宝石脚本直接从bash执行
更多的代码:
p_out, p_in = IO.pipe
@@thread = Thread.new {
cmd = "gpg --no-tty --cipher-algo AES256 --compress-level 0 --passphrase-file #{@@cmd.results[:gpg_passphrase_file]} --symmetric"
# Execute gpg
Open3.popen3 (cmd) { |stdin, stdout, stderr, wait_thr|
Thread.new {
cnt = IO::copy_stream pipe, stdin
@@output.debug "GPG_Encryption::execute copied #{(Float(cnt)/1024/1024).round(2)} MiB bytes to gpg"
pipe.close
stdin.close
}
Thread.new {
cnt = IO::copy_stream stdout, p_in
@@output.debug "GPG_Encryption::execute copied #{(Float(cnt)/1024/1024).round(2)} MiB bytes from gpg"
}
# wait for gpg finished
wait_thr.join
# Close pipe (sends eof)
p_in.close
# check result
if 0 == wait_thr.value
@@output.info "gpg finished..."
else
@@output.error "gpg returned an error"
@@output.raw stderr.readlines.join
exit 1
end
}
}
ftp = Net::FTP.new(@@host, @@user, @@password)
ftp.debug_mode = true
ftp.passive = true
ftp.binary = true
ftp.storbinary("STOR #{name}", pipe, Net::FTP::DEFAULT_BLOCKSIZE)
ftp.close
谢谢davogones,我只是试过了,但没有区别。存储的文件仍然很小。但是如果整个脚本在传输完成之前结束呢?有没有办法等待发送的所有内容,如连接线程? – PiperAtTheGatesOfDawn 2015-02-08 09:41:59