2014-02-20 107 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

相關問題