允许用户从我的S3 Bucket下载图像

时间:2014-02-20 14:48:27

标签: ruby-on-rails ruby amazon-s3 uri

我正在尝试构建一个允许用户从我的s3存储桶下载pdf文件的方法(目前正在进行)

但网址的某些部分可能会不时更改,例如/ timetables之后的ID号,文件名(但始终是pdf)和文件名后面的ID号

这是我到目前为止所拥有的

def download
  path = "images/timetables/14/original.pdf?"
  data = open("http://#{ENV['AWS_BUCKET']}.s3.amazonaws.com/#{path}/1392904333") 
  send_data data.read, filename: 'Timetable',
                       type: 'application/pdf', 
                       disposition: 'attachment', 
                       stream: 'true', 
                       buffer_size: '4096'

end

有没有办法即时获取此信息或者我只能对其进行硬编码?理想情况下,我想尽可能多地将路径存储到变量中。

有人可以告诉我如何正确地做到这一点。

由于

1 个答案:

答案 0 :(得分:2)

使用paperclip管理上传会更容易。使用此功能,您将创建一个表格来保存记录,该记录将在S3上为您上传的文件提供动态参考。

工作流程如下:

  • 您将相关PDF上传到您的应用
  • paperclip将其上传到S3并将URL保存到您的数据库
  • 您为用户提供了PDF的S3网址链接
  • 或者,您可以向他们提供指向您的记录的链接,并在上面发布时启动下载

首先,保存pdf文件引用的模型如下所示:

class PdfRecord < ActiveRecord::Base
  has_attached_file :pdf, :storage => :s3,
    :bucket => 'S3_BUCKET_NAME',
    :s3_credentials => {
      :access_key_id => 'AWS_ACCESS_KEY_ID',
      :secret_access_key => 'AWS_SECRET_ACCESS_KEY'
    }
end

为自己创建一个表单以上传您的pdf:

# app/views/pdf_records/new
<%= form_for @pdf_record, multipart: true do |f| %>
  <%= f.label :pdf %>
  <%= f.file_field :pdf %>
  <%= f.submit %>
<% end %>

使用此表单,您可以上传pdf,回形针将其保存到S3,并在数据库中保留对它的引用。

为您的用户提供指向您pdf_record的链接:

@pdf_record = PdfRecord.find(which ever one you want)
@pdf_record.pdf.url # => the S3 url

为您的用户提供该网址会让他们直接下载pdf,但是,如果您想要隐藏网址并允许您更新PDF而不断开链接,则可以为用户提供指向pdf_record的链接然后从控制器开始下载:

# give your users this url, as defined in your routes.rb
pdf_record_url(@pdf_record)

然后在pdf_record控制器的show动作中:

def show
  pdf_record = PdfRecord.find(params[:id])
  data = open(pdf_record.pdf.url) 
  send_data data.read, filename: pdf_record.pdf_file_name,
                       type: pdf_record.pdf_content_type, 
                       disposition: 'attachment', 
                       stream: 'true', 
                       buffer_size: '4096'
end

现在,您可以随时更新pdf_record,并且由于您的用户拥有指向记录的链接而不是实际的pdf文件,因此该链接始终有效。