我正在製作一個帶有付費下載的webapp,我遵循Carrierwave的指南protecting uploads。一切工作都在期待着拯救一件事。這裏是我的當前設置:顯示Rails Carrierwave URL,無需公開整個路徑
產品文件上傳
...
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}"
,我在嘗試上傳到我的PC的根目錄時遇到訪問錯誤。 "downloads/#{model.product_id}/#{model.id}"
只是簡單地上傳到public
目錄中的一個新文件夾,稱爲下載,這不是我想要做的。
有關如何進行的任何建議?謝謝。
編輯:
我發現,在Carrierwave配置文件到Rails.root
設置config.root
允許這種行爲。如果我這樣做,在我的ProductFileUploader
我可以指定store_dir
爲"downloads/#{model.product_id}/#{model.id}
。
但是,這意味着公共文件將保存在「/ public/...」鏈接中。 Rails自動放棄公用文件夾名稱並使用URL中的子目錄名稱。