2014-02-20 133 views
1

我试图构建一个方法,这将允许用户下载从我的S3存储PDF文件,(这在目前它)允许用户从我的S3存储

下载形象,但一些地区该URL可能随时改变,像/时间表后的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上传到您的应用程序
  • 回形针上传它S3并保存URL到数据库
  • 您提供一个链接到你的用户对于PDF的S3 URL
  • 或者你给他们链接到你的纪录,你开始下载你发布上述

首先将举行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 

从而给用户带来的是URL将让他们下载的PDF直接然而,如果你要隐藏的网址,并允许您更新PDF不用断开链路可以给用户一个链接pdf_record,然后你开始从你的控制器下载:在pdf_record控制器的表演动作

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

然后:

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文件链接将始终工作。

+0

谢谢你这样深入的回答,我已经使用回形针了,所以我会稍后再试 – Richlewis

相关问题