2017-01-07 27 views
0

Я использую версию Carrierwave 1.0.0rc для загрузки и обработки файлов в ведро AWS S3. Вот моя среда:Загрузка Carrierwave на S3 с использованием fog/aws gem приводит к «Нет такого файла или каталога @ rb_sysopen»

Rails 4.2.0 рубин 2.1.1 MiniMagick 4.5.1 ImageMagick 6.9.7-0

Мой загрузчик определяет, если исходное изображение будет загружено в пейзаж или портрет и будет применяйте соответствующие правила обработки. Файл загрузки в ведре AWS S3, но затем я получаю следующее сообщение об ошибке:

Errno :: ENOENT в SponsorsController # создать Нет такого файла или каталога @ rb_sysopen - добавления/спонсор/логотип/30/Breen_Electrical_Logo.jpg

и извлеченный источник показывает этот код выделен:

 image = MiniMagick::Image.open(picture.path) 

Вот мой загрузчиком код:

class LogoUploader < CarrierWave::Uploader::Base 

    include CarrierWave::MiniMagick 
    storage :fog 

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

    version :landscape, if: :is_landscape? 

    version :portrait, if: :is_portrait? 

    version :landscape do 
     process resize_to_fit: [200, 50] 
    end 

    version :landscape_sm, from_version: :landscape do 
     process resize_to_fit: [100, 25] 
    end 

    version :portrait do 
     process resize_to_fit: [50, 200] 
    end 

    version :portrait_sm, from_version: :portrait do 
     process resize_to_fit: [25, 100] 
    end 

    private 

    def is_landscape? picture 
     image = MiniMagick::Image.open(picture.path) 
     image[:width] > image[:height] 
    end 

    def is_portrait? picture 
     image = MiniMagick::Image.open(picture.path) 
     image[:width] < image[:height] 
    end 
    end 

-ц Кажется, что методы ivate открывают файл для сравнения его значений ширины и высоты. Это очень сработало, когда я хранили файлы в локальной общей папке. Я предполагаю, что URL-адрес «picture.path» не указывает путь к веществу S3, чтобы открыть файл.

Вот мой /config/initializers/carrierwave.rb файл

require 'fog/aws' 

CarrierWave.configure do |config| 
    config.fog_provider = 'fog/aws'    
    config.fog_credentials = { 
    provider:    'AWS',    
    aws_access_key_id:  <access_key_id>,  
    aws_secret_access_key: <secret_access_key>,  
    region:    'us-west-2',     
    :path_style   => true 
    } 
    config.fog_directory = <bucketname> 
end 

Я не могу показаться, чтобы найти другие, имеющие один и тот же вопрос. Есть идеи? Заранее спасибо.

ответ

0

Я думаю, вам нужно будет обратиться к файлу напрямую, а не только к пути, поскольку он не будет локальным. Что-то вроде:

ruby image = MiniMagick::Image.open(picture.file)

+0

Там не кажется, метод файла для MiniMagick. Я получаю ошибки, когда пытаюсь использовать его, когда вы описываете. –

+0

Я подумал от чтения вашего кода, что 'picture' будет объект с несущей (а не с минимальным). Поэтому я предполагаю, что, по крайней мере, ожидаю ошибку несущей. – geemus