Я делаю webapp с платной загрузкой, и я следил за путеводителем Carrierwave за protecting uploads. Все работает как ожидающее, кроме всего прочего. Вот моя текущая настройка:Показать Rails URL-адрес несущей, не подвергая весь путь
Файл продукта Uploader
...
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 Root.
Так, например, 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}"
, я получаю ошибку доступа, поскольку она пытается загрузить в корень моего ПК. "downloads/#{model.product_id}/#{model.id}"
просто загружает в новую папку в каталоге public
с именем downloads, что я не хочу делать.
Любые советы о том, как действовать? Благодарю.
Edit:
Я обнаружил, что установка config.root
в Carrierwave конфигурационный файл в Rails.root
позволяет это поведение. Если я это сделаю, в моем ProductFileUploader
я могу указать store_dir
как "downloads/#{model.product_id}/#{model.id}
.
Однако это означает, что общедоступные файлы сохраняются с помощью ссылки «/ public/...». Rails автоматически отбрасывает имя общей папки и использует имена подкаталогов в URL-адресе.