Carrierwave使用fog/aws gem上传到S3导致“没有这样的文件或目录@ rb_sysopen”

问题描述:

我使用Carrierwave版本1.0.0rc将文件上传和处理到AWS S3存储桶。下面是我的环境:Carrierwave使用fog/aws gem上传到S3导致“没有这样的文件或目录@ rb_sysopen”

的Rails 4.2.0 的Ruby 2.1.1 MiniMagick 4.5.1 的ImageMagick 6.9.7-0

我上传决定是否要上传的原始图像是横向或纵向和意志相应地应用处理规则。该文件上传到AWS S3斗,但后来我得到以下错误:在SponsorsController#

变量Errno :: ENOENT创建 没有这样的文件或目录@ 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 

在PR ivate方法似乎打开文件来比较其宽度和高度值。当我在本地公用文件夹中存储文件时,这工作得很好。我猜测“picture.path”url并不指向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 

我似乎无法找到有同样的问题等。有任何想法吗?提前致谢。

我想你需要直接引用文件,而不是路径,因为它不会是本地的。喜欢的东西:

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

+0

似乎没有成为MiniMagick一个文件的方法。当我尝试按照您的描述使用它时,我遇到了错误。 –

+0

我认为从阅读你的代码'图片'会有一个载波对象(而不是最小的一个)。所以我想我会至少期待一个载波错误。 – geemus