2014-07-24 104 views
1

我正在用rails 4開發一個web應用程序,我目前面臨一個小問題。允許客戶端從ftp rails下載文件

我想讓網站的用戶能夠通過單擊鏈接從ftp下載文件。我決定去這個:

def download 

    @item=Item.find(params[:id]) 
    @item.dl_count += 1 
    @item.save 
    url = @item.file_url.to_s  
    redirect_to url and return 

end 

而且,很基本,這在我看來:

<%= link_to 'DL', controller: "items", action: "download"%> 

不過,我不是這個相當滿意,因爲它會產生一些錯誤就像點擊鏈接創建兩個GET方法,一個通過403 Forbidden響應,另一個響應302找到...

您是否有任何關於如何改善此問題的想法?

+0

由用戶(IE是動態的),上傳的文件,或者是他們靜態的?如果它們是靜態的,那麼你肯定可以把它們放在'/ public'文件夾中,以便普通用戶可以訪問它們? –

+0

他們是動態的。我選擇FTP託管的原因是因爲我想在Heroku上部署我的應用程序,所以無法免費創建文件系統。 – R0bur

回答

1

在Rails中你應該做的:

def download 
    @item=Item.find(params[:id]) 
    @item.dl_count += 1 
    @item.save 
    url = @item.file_url.to_s  
    send_file url, type: 'image/jpeg', disposition: 'inline' 
end 

看看以瞭解更多信息http://apidock.com/rails/ActionController/DataStreaming/send_file

注意,由send_file可以從本地文件系統只發送。

如果你需要從遠程源文件(應該是安全的地點),如http://example.com/apps/uploads/tfm.zip和避免儲存在服務器內存中這個文件,你可以先保存在#文件{RAILS_ROOT}/TMP /或系統的/ tmp目錄,然後由send_file

data = open(url) 
filename = "#{RAILS_ROOT}/tmp/my_temp_file" 

File.open(filename, 'w') do |f| 
    f.write data.read 
end 

send_file filename, ...options... 

如果滑軌不能讀文件,你應該檢查文件權限

+0

我在嘗試你所說的時出現這個錯誤:無法讀取文件http://#addressofmytfp/apps/uploads/tfm.zip – R0bur

+0

@ R0bur檢查答案更新 – KRol