我想在用户通过手机下载信息的同时向用户发送电子邮件。我正在尝试发送的pdf使用CarrierWave存储在AWS上。我不完全确定如何从CarrierWave访问文件。
问题#1) - 不那么重要 - 一个问题是我应该要求服务器从AWS下载这些文件以通过电子邮件发送,还是应该在将这些文件上载到AWS时将这些文件缓存在服务器上。目前在AWS上存储文件的目的是将它们下拉到iOS客户端(手机)。
...我们现在假设我正在尝试从AWS下载文件(pdf)以通过电子邮件发送。下面代码中的命令File.read(@file)
将无效,因为我正在尝试下拉文件,例如(示例 - @file ='http://placecorgi.com/100/100.pdf')不是文件而是服务器上的文件。
问题#2) - 更重要 - 我需要更改什么才能从AWS下载此文件并通过UserMailer发送?
这是UserMailer - 我正在尝试修复方法send_user_pages
。方法welcome_email
运行正常。
class UserMailer < ActionMailer::Base
def welcome_email(user)
@user = user
attachments['mail.pdf'] = File.read('mail.pdf')
mail(to: user.email, subject: 'Welcome to App!')
end
def send_user_pages(user, pages_array)
@user = user
@pages_array = pages_array
pages_array.each_with_index do |page, index|
@file = "#{page.url}"
attachments["user_pages_#{index}.pdf"] = File.read(@file)
end
mail(to: user.email, subject: 'Your Pages')
end
end
这是我的CarrierWave设置......
CarrierWave.configure do |config|
if Rails.env.test?
config.storage = :file
else
config.storage = :fog
config.fog_credentials = {
provider: 'AWS',
aws_access_key_id: ENV['S3_ACCESS_KEY_ID'],
aws_secret_access_key: ENV['S3_SECRET_ACCESS_KEY'],
region: 'us-west-1'
}
if Rails.env.production?
config.fog_directory = ENV['AWS_BUCKET']
else
config.fog_directory = 'q-local'
end
end
end
这是我的CarrierWave上传器......
class AssetUploader < CarrierWave::Uploader::Base
def self.with_allowed_type(*types)
klass = Class.new(self)
klass.instance_eval do
define_method :extension_white_list do
types
end
end
klass
end
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
end
答案 0 :(得分:0)
我假设您要在电子邮件中向aws文件路径提供安全链接,以便用户下载pdf。如果是这样的话,你可以这样做
s3 = AWS::S3.new
bucket = s3.buckets['your-bucket-name']
# file path (change it to yours)
relative_path = "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}.pdf"
obj = bucket.objects[relative_path]
# in this example, the download link will expire in 10 mins, probably you should remove it if you dont want
s3_url = obj.url_for(:read, :secure => true, :expires => 10.minutes).to_s
并将此s3_url
传递给电子邮件。