我有一个rake任务连接到ftp服务器,下载文件,然后枪杀它。这在本地工作,但是当我在我的heroku雪松服务器上运行任务时,我执行net :: ftp.getbinaryfile后没有反馈。
以下是下载文件的代码:
tempfile = "#{Rails.root}/tmp/#{Process.pid}_#{MyApp::Application.config.products_bbcom_file}"
ftp = Net::FTP.new()
puts "connecting to ftp server #{MyApp::Application.config.products_bbcom_host}"
ftp.connect(MyApp::Application.config.products_bbcom_host)
puts "logging in"
ftp.login(MyApp::Application.config.products_bbcom_user,MyApp::Application.config.products_bbcom_pass)
puts "changing directory"
files = ftp.chdir(MyApp::Application.config.products_bbcom_path)
#files = ftp.list('n*')
puts "downloading file #{MyApp::Application.config.products_bbcom_file} to #{tempfile}"
ftp.getbinaryfile(MyApp::Application.config.products_bbcom_file, tempfile, 1024)
ftp.close
当我在heroku上执行任务时:heroku运行rake db:import并拖尾我看到的日志:
2012-09-10T16:26:24+00:00 heroku[run.1]: Awaiting client
2012-09-10T16:26:24+00:00 heroku[run.1]: Starting process with command `bundle exec rake db:import`
2012-09-10T16:26:25+00:00 heroku[run.1]: State changed from starting to up
任务的输出到达:
== Starting ==
Connecting to database specified by DATABASE_URL
connecting to ftp server datatransfer.cj.com
logging in
changing directory
downloading file
脚本达到了尝试将文件下载到#{Rails.root} / tmp /的程度,但之后再也没有响应。这只需要几秒钟本地,但我等了几分钟,任务没有做任何事情。
从heroku开发网站看来,您可以将文件保存到#{Rails.root} / tmp / on cedar。这可能吗?如果是这样,我采取了错误的做法?
答案 0 :(得分:4)
可以下载文件vit .NET :: FTP,但heroku只支持PASSIVE模式FTP。我需要指定我想使用被动模式。这是一个简化的例子:
ftp = Net::FTP.new()
ftp.passive = true
ftp.connect(host)
ftp.login(username,password)
files = ftp.chdir(path_to_file)
ftp.getbinaryfile(filename, tempfile, 1024)
ftp.close
答案 1 :(得分:0)
您可以将文件保存到./tmp,但要知道如果dyno重新启动,那么数据将会消失。另外,一个dyno无法访问另一个dyno的tmp目录。
对于数据处理和短期存储,tmp目录是一个很好的选择。
答案 2 :(得分:0)
您是否尝试备份/导入数据库?
使用PGBACKUPS。转储进入S3。您可以从那里下载或导入。
https://devcenter.heroku.com/articles/pgbackups#restoring-from-a-backup
在切换到heroku之前,我曾经通过FTP做同样的事情。 pgbackups让它变得如此简单。