【发布时间】:2016-12-27 08:32:13
【问题描述】:
我正在制作一个付费下载的网络应用程序,我按照 Carrierwave 的protecting uploads 指南进行操作。一切都按预期工作,除了一件事。这是我当前的设置:
产品文件上传器
...
def store_dir
"#{Rails.root}/downloads/#{model.product_id}/#{model.id}"
end
...
路线
get "/downloads/:product_id/:product_file_id/:filename", :controller => "products", action: "download", conditions: {method: :get}
ProductsController
def download
product_file = ProductFile.find(params[:product_file_id])
name = File.basename(product_file.file.file.file)
send_file "#{Rails.root}/downloads/#{product_file.product.id}/#{product_file.id}/#{name}", :x_sendfile => true
end
问题在于下载路径。因为我在文件上传器中指定了#{Rails.root},所以文件保存在公用文件夹外部名为downloads 的文件夹中。然而,这有一个意想不到的副作用。当我从我的模型中检索 URL 时,我得到了整个绝对路径,而不是相对于 Rails 根目录的路径。
例如,ProductFile.first.file.url 返回 "/home/doomy/Documents/resamplr/downloads/3/1/aaaa.zip",而它应该只返回 /downloads/3/1/aaa.zip。
此行为似乎与ProductFileUploader 中指定的内容有关。
例如,如果我将 store_dir 更改为 "/downloads/#{model.product_id}/#{model.id}",我会在尝试上传到我的 PC 的根目录时收到访问错误。 "downloads/#{model.product_id}/#{model.id}" 只是上传到 public 目录中的一个新文件夹,名为 downloads,这不是我想做的。
关于如何进行的任何建议?谢谢。
编辑:
我发现将载波配置文件中的config.root 设置为Rails.root 允许这种行为。如果我这样做,在我的ProductFileUploader 中,我可以将store_dir 指定为"downloads/#{model.product_id}/#{model.id}。
但是,这意味着公共文件使用“/public/...”链接保存。 Rails 会自动丢弃公用文件夹名称,并在 URL 中使用子目录名称。
【问题讨论】:
标签: ruby-on-rails ruby carrierwave