2013-08-05 100 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)