啊,是的,我以前做过这个。我假设你会使用文件上传宝石,例如Paperclip,并创建了一个名为Pdf的模型,类似于:
class Pdf < ActiveRecord::Base
has_attached_file :pdf, storage: :s3
end
这将设置模型,以便您可以上传文件并将其存储在AWS S3中。您可能目前还没有这样的模型,但想法是拥有一个数据库记录,您可以在其中引用Pdf的URL以及一个唯一令牌供用户使用,以便不知道实际URL。
在Pdf模型中,您应该有一个token:string字段,并在模型的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'
在Pdfs控制器中添加get_hidden操作:
class PdfsController < ApplicationController
def get_hidden
pdf = Pdf.where(token: params[:token]).first
if pdf
data = open pdf.url
send_data data.read, filename: pdf.pdf_file_name, type: "application/pdf", disposition: 'inline', stream: 'true', buffer_size: '4096'
else
end
end
end
现在,您只需向用户发送一个URL,例如
myapp.com/pdfs/random-string-here,当用户访问该URL时,您的应用程序将通过该令牌在数据库中查找记录,在AWS上获取PDF的实际URL,并从中读取数据并强制浏览器下载所有内容,而无需向最终用户显示真实的URL。请注意,HTML标签已被保留。