使用rails中的carrierwave将文件从本地计算机上传到s3到s3

时间:2011-12-27 19:56:30

标签: ruby-on-rails amazon-s3 carrierwave

我正在尝试使用carrierwave将文件从本地计算机上传到amazon s3。实际上我想为上述操作编写迁移。我需要将本地存储的图像移动到亚马逊。任何人都可以告诉我如何使用carrierwave的方法执行上述操作。 顺便说一句,我也在载波上使用Carrierwave_direct,但我认为这不会影响我的存储方法。

我执行了uploader.store!(/local/path/to/file)但它失败并出现以下错误:

  

您尝试将字符串或路径名分配给上传器,用于   出于安全考虑,这是不允许的。

我可以在方法中的路径信息中发送任何其他方式吗?

我也尝试过执行:

new_file.asset = File.open('full/path') #asset is where my uploader is mounted

在这种情况下,当我尝试new_file.save!时,它会成功保存,但当我尝试通过doin new_file.asset.url获取网址时,它显示为空。我不知道为什么

继承我的上传者:

module DirectUploader
  extend ActiveSupport::Concern

  included do
    include CarrierWave::MimeTypes
    include CarrierWave::MiniMagick

    include CarrierWaveDirect::Uploader
    include ActiveModel::Conversion
    extend ActiveModel::Naming

    process :set_content_type
  end

  module InstanceMethods
    def store_dir
      "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
    end

    # override the url to return absolute url if available and
    # revert back to standard functionality if it is not available
    def url
      if model.absolute_url.nil?
        super
      else
        model.absolute_url
      end
    end

    def filename
      @random = Digest::MD5.hexdigest(model.latest_time.to_s)
      "#{@random}.#{File.extname(original_filename)}" if original_filename
    end

    def policy_doc(options={})
      options[:expiration] ||= self.class.upload_expiration
      options[:max_file_size] ||= self.class.max_file_size

      doc = {
          'expiration' => Time.now.utc + options[:expiration],
          'conditions' => [
              ["starts-with", "$utf8", ""],
              ["starts-with", "$authenticity_token", ""],
              ["starts-with", "$key", store_dir],
              {"bucket" => fog_directory},
              {"acl" => acl},
              ["content-length-range", 1, options[:max_file_size]]
          ]
      }
      doc['conditions'] << {"success_action_redirect" => success_action_redirect} if success_action_redirect
      doc
    end

    def policy(options={})
      Base64.encode64(policy_doc(options).to_json).gsub("\n","")
    end
  end
end

在carrierwave配置中没有问题,因为我可以使用form / html上传文件。只是我在迁移过程中发现了问题。

1 个答案:

答案 0 :(得分:0)

你试过了吗?

uploader.store!(File.new('/local/path/to/file'))

当我运行测试时,我使用:

uploader.store! File.open(Rails.root.join("spec/support/file.png"))