我正在尝试构建一个允许用户从我的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
有没有办法即时获取此信息或者我只能对其进行硬编码?理想情况下,我想尽可能多地将路径存储到变量中。
有人可以告诉我如何正确地做到这一点。
由于
答案 0 :(得分:2)
使用paperclip管理上传会更容易。使用此功能,您将创建一个表格来保存记录,该记录将在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文件,因此该链接始终有效。