簡體   English   中英

使用aws-sdk在rails中為ruby下載S3文件(對象)

[英]Downloading S3 files(objects) using aws-sdk for ruby in rails

我沒有使用paperclip或carrierwave或任何其他寶石與亞馬遜網絡服務s3進行互動。 事實上,我沒有使用任何模型,只是直接與S3對象進行交互。

有人可以提供一些代碼來說明如何從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

我需要能夠將下載的文件保存在桌面上任何可瀏覽的非預定位置。我真的很感激如何修改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類型或保留文件名,如果這是@Frederick Cheung提到的問題嗎? 謝謝

您可能最好為用戶提供直接從S3下載而不是嘗試通過Rails應用程序傳輸文件的URL。

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM