我没有使用paperclip、carrierwave或任何其他宝石与Amazon Web Services 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所提到的问题,谢谢。