Выгрузка файлов на s3 с локального компьютера на s3 с использованием carrierwave в рельсах - PullRequest
3 голосов
/ 27 декабря 2011

Я пытаюсь загрузить файлы с локального компьютера на amazon s3 с помощью carrierwave. На самом деле я хочу написать миграцию для вышеуказанных операций. Мне нужно переместить изображения, которые хранятся локально, в Amazon. Может кто-нибудь сказать мне, как я должен выполнить вышеупомянутые операции, используя методы carrierwave. Кстати, я также использую Carrierwave_direct поверх carrierwave, но я не думаю, что это повлияет на мои методы хранения.

Я выполнил uploader.store!(/local/path/to/file), но произошел сбой со следующей ошибкой:

Вы пытались назначить строку или путь к загрузчику, для по соображениям безопасности, это не разрешено.

Есть ли другой способ, которым я могу отправить информацию о пути в методе?

Я также пытался выполнить:

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

В этом случае, когда я пытаюсь new_file.save!, он успешно сохраняется, но когда я пытаюсь получить URL-адрес с помощью 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, потому что я могу загружать файлы, используя форму / html. Просто я нахожу проблемы во время миграции.

1 Ответ

0 голосов
/ 28 сентября 2012

Вы пробовали:

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

Когда я запускаю тесты, я использую:

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