如何使用Rails UserMailer方法访问使用CarrierWave保存的文件?

时间:2015-01-10 19:46:50

标签: ruby-on-rails pdf amazon-web-services download carrierwave

我想在用户通过手机下载信息的同时向用户发送电子邮件。我正在尝试发送的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

1 个答案:

答案 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传递给电子邮件。