2013-08-05 102 views
5

我沒有使用paperclip或carrierwave或任何其他gem與amazon web服務s3進行交互。事實上,我沒有使用任何模型,只是直接與S3對象交互。使用aws-sdk下載S3文件(對象)for ruby​​ in rails

是否有人可以提供一些代碼爲如何直接從AWS S3下載對象(文件)

這是到目前爲止我的代碼:

查看:

<h2>Download Files</h2> 
<%@root_files.each do |file| %> 
<% next if @obj %>   
<td>Filename: <b><%= file %></b></td> 
<td><%= link_to "Download", download_url_for(file) %></td> 
<% end %> 

通訊控制器:

def xxx 
bucket = AWS::S3.new.buckets[ ENV["BUCKET"]] 
@root_files = bucket.as_tree.children.select(&:leaf?).collect(&:key) 
end 

download_url_for方法

def download_url_for(file_key) 
    s3 = AWS::S3.new 
    bucket = s3.buckets[ ENV["BUCKET"]] 
    object = bucket.objects[file_key] 
    File.open('xxxxx', 'wb') do |file| 
    object.read do |chunk| 
     file.write(chunk) 
    end 
    end 
end 

我需要能夠保存在任何可瀏覽非pretedetermined位置下載的文件在我的desktop.Id真的很感激視圖上如何修改download_url_for方法來實現這一目標。

===================================== 我只是用

<td><%= link_to "Download",object.value.url_for(:read).to_s %></td> 
嘗試

但是在下載時我只能得到一個帶有xml內容的zip文件,而不是原始文件(在我的例子中是word文檔)---關於如何修改這個以獲得實際文件類型和內容的任何想法?由於

=======================繼承人我要上傳的文件

查看代碼代碼:

<%= form_tag({:action => 'create_file'}, multipart: true) do %> 
<%= file_field_tag 'uploaded_file' %><br /> 
<%= submit_tag 'Upload' %> <br /> 
<% end %> 

控制器動作 - create_file行動

def create_file 
s3 = AWS::S3.new 
bucket = s3.buckets[ENV["BUCKET"]] 
key = params[:uploaded_file].original_filename 
object = bucket.objects[key] 
object.write(params[:uploaded_file].read) 
end 

有人建議,我怎麼可以檢查MIME類型或保存而UPL文件名如果那是由@Frederick Cheung提及的問題,請提交?謝謝

+0

的docx文件是幕後壓縮的XML文件 - 聽起來像你也許不會在文件保存MIME類型或文件名已上傳。 –

+0

在下面編輯我的回覆。 – rossta

+0

@Frederick Cheung Ive更新了我的原始問題以包含我的上傳代碼......請允許我告訴我如何在上傳時檢查MIME或文件名? – orange88

回答

2

你可能會更好提供一個用戶從S3直接下載的網址,而不是試圖通過你的Rails應用流式傳輸文件。

aws-sdk提供了url_for方法來完成此操作:http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/S3/S3Object.html#url_for-instance_method。這需要對過期,安全性,緩存等一個基本的例子一堆選項:

<td><%= link_to "Download", file.url_for(:read) %></td> 

- 編輯 -

要訪問url_for方法在視圖中,你需要引用s3對象。所以,在你的控制器,你要收集對象從葉子節點,沒有鑰匙

@root_files = bucket.as_tree.children.select(&:leaf?).collect(&:object)