Ах, да, я сделал это раньше. Я предполагаю, что вы будете использовать драгоценный камень загрузки файлов, такой как Paperclip и создал некоторые модели, такие как Pdf как:
class Pdf < ActiveRecord::Base
has_attached_file :pdf, storage: :s3
end
Это создает модель, так что вы можете загрузить файл на него, и он будет хранить это в AWS S3. Возможно, у вас может не быть этого в настоящее время, но идея состоит в том, чтобы иметь запись базы данных, где вы можете иметь ссылку на URL-адрес Pdf, а также уникальный токен, который ваши пользователи будут использовать для извлечения, не зная реального URL.
В модели Pdf вы должны иметь маркер: строковое поле и в before_save фильтра в модели генерировать уникальный маркер:
class Pdf < ActiveRecord::Base
require 'securerandom'
has_attached_file :pdf, storage: :s3
before_save :generate_unique_token
private
def generate_unique_token
self.token ||= SecureRandom.hex
end
end
И теперь вы можете создать именованный маршрут:
get '/hidden_pdf/:token', to: 'pdfs#get_hidden'
Добавьте get_hidden действие в контроллер PDFS:
class PdfsController < ApplicationController
def get_hidden
pdf = Pdf.where(token: params[:token]).first
if pdf
# from the pdf model you have access to its real URL and you can send it directly
data = open pdf.url
send_data data.read, filename: pdf.pdf_file_name, type: "application/pdf", disposition: 'inline', stream: 'true', buffer_size: '4096'
else
# Not found logic here
end
end
end
Теперь вы можете просто отправить своим пользователям такой URL-адрес, как myapp.com/pdfs/random-string-here, и когда они пойдут к нему, ваше приложение найдет запись в базе данных этим токеном, вытащит реальный URL-адрес PDF на AWS, прочитать данные из него и принудительно загрузить в браузер все, не указав реального URL-адреса конечного пользователя.