【问题标题】:Downloading S3 files(objects) using aws-sdk for ruby in rails在 Rails 中使用 aws-sdk 为 ruby​​ 下载 S3 文件(对象)
【发布时间】:2013-08-05 09:12:14
【问题描述】:

我没有使用回形针、carrierwave 或任何其他 gem 来与亚马逊网络服务 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

如果这是@Frederick Cheung 提到的问题,有人可以建议我如何在上传时检查 MIME 类型或保留文件名吗?谢谢

【问题讨论】:

  • docx 文件是在后台压缩的 xml 文件 - 听起来您在上传文件时可能没有保留 mime 类型或文件名。
  • 在下面编辑了我的回复。
  • @Frederick Cheung 我已经更新了我原来的问题以包括我的上传代码...你能告诉我如何在上传时检查 MIME 或文件名吗?

标签: ruby-on-rails ruby forms amazon-web-services amazon-s3


【解决方案1】:

您最好提供一个 url 供用户直接从 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    • 2011-10-17
    • 1970-01-01
    • 2011-03-28
    • 2013-06-08
    • 1970-01-01
    相关资源
    最近更新 更多