【问题标题】:How do I use Rails UserMailer method to access files saved with CarrierWave?如何使用 Rails UserMailer 方法访问使用 CarrierWave 保存的文件?
【发布时间】:2015-01-10 19:46:49
【问题描述】:

我想在用户通过手机下载信息的同时向他们发送电子邮件。我尝试发送的 pdf 使用 CarrierWave 存储在 AWS 上。我不完全确定如何从 CarrierWave 访问文件。

问题 #1) - 不太重要 - 一个问题是我应该要求服务器从 AWS 中提取这些文件以通过电子邮件发送,还是应该在将这些文件上传到 AWS 时将它们缓存在服务器上。目前在 AWS 上存储文件的目的是为了将它们拉到 iOS 客户端(手机)。

...让我们假设现在我正在尝试从 AWS 中提取文件 (pdf) 以通过电子邮件发送。下面代码中的命令 File.read(@file) 将不起作用,因为我试图拉下一个文件,例如 (example - @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

【问题讨论】:

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


    【解决方案1】:

    我假设您想在电子邮件中向用户提供指向 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 传递到电子邮件中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-10
      • 1970-01-01
      • 2017-01-09
      • 1970-01-01
      相关资源
      最近更新 更多