在 Heroku 中构建可下载的站点地图 zip 文件
Posted
技术标签:
【中文标题】在 Heroku 中构建可下载的站点地图 zip 文件【英文标题】:Building a downloadable sitemap zip file in Heroku 【发布时间】:2013-06-28 17:44:08 【问题描述】:我正在 Heroku / Ruby Sinatra 中构建一个网络工具,用于抓取网络域并下载所有指定的文件类型(它应该提供要下载的域文件类型的站点地图的 zip 文件)。
我想弄清楚如何在 Heroku 上构建一个 ZipFile。如何设置主目录?然后,一旦我有了 ZipFile,如何链接到它以便下载?
这是目前为止的一些相关代码:
anemone.after_crawl do
puts "Crawl finished. Gathering files, preparing download..."
datasets.each do |url|
u = URI.parse(url.to_s)
Net::HTTP.start(u.host) |http|
resp = http.get(u.path)
if u.path[0] == "/"
u.path[0] = ''
end
full_path = u.path.split("/")
i = 0
len = full_path.size
filename = full_path[-1]
Zip::ZipFile.open(u.host + ".zip", Zip::ZipFile::CREATE)
|zipfile|
while i < (len-1) do
directory = full_path[i]
unless File.directory?(directory)
zipfile.mkdir(directory)
end
Dir.chdir directory
i+=1
end
zipfile.add(filename);
while (i > 0) do
Dir.chdir File.expand_path("..",Dir.pwd)
i-=1
end
end
end
【问题讨论】:
【参考方案1】:Heroku 文件系统是 mostly read-only,但您应该能够将 zip 文件临时存储在 /tmp
上:
Zip::ZipFile.open("#RAILS_ROOT/tmp/" + u.host + ".zip", Zip::ZipFile::CREATE)
您可能希望在“下载”控制器中使用send_file
以允许用户下载文件。您需要构建错误处理,以防临时文件在用户下载之前消失(例如,如果 dyno 在 zipfile 创建和下载之间重新启动)。
编辑
我链接的文档显然已经过时了。 RAILS_ROOT
是 Rails 2 引用目录根目录的方式,但 Rails 3 方式 (Rails.root
) 也不起作用——在 Heroku 中它引用 ./app
文件夹。
但是,您可以使用 Heroku 基础文件系统 /tmp
文件夹,如下所示:
Zip::ZipFile.open("/tmp/" + u.host + ".zip", Zip::ZipFile::CREATE)
【讨论】:
谢谢,非常感谢。以上是关于在 Heroku 中构建可下载的站点地图 zip 文件的主要内容,如果未能解决你的问题,请参考以下文章