2014-02-20 3 views
1

Я пытаюсь построить метод, который позволит пользователю скачать PDF-файл из моего s3 ведра, (который в данный момент он делает)Разрешения пользователя для загрузки изображения из моего S3 Bucket

Но некоторые части URL-адрес может меняться время от времени, как и номер документа после/расписаниях, имя файла (но всегда будет PDF) и идентификационный номер после имени файла

Это то, что я до сих пор

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 в вопрос к вашему приложению
  • PAPERCLIP будет загружать его в S3 и сохраняет URL в базе данных
  • вы предоставить ссылку на ваш сайт для URL S3 в PDF
  • ИЛИ вы дайте им ссылку на вашу запись, и вы начать загрузку, как вы писали выше

Первая модель, которая будет содержать ссылку 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 непосредственно, однако, если вы хотите, чтобы скрыть URL, а также позволяет обновлять PDF без разрыва связи вы можете дать пользователям ссылку на pdf_record а затем начать загрузку из контроллера:

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

Тогда в шоу действия контроллера 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

Спасибо за такой глубокий ответ, я уже использую paperclip, поэтому я попробую это позже – Richlewis

Смежные вопросы