【问题标题】:Carrierwave uploads to S3 using fog/aws gem result in "No such file or directory @ rb_sysopen"Carrierwave 使用雾/aws gem 上传到 S3 导致“没有这样的文件或目录@rb_sysopen”
【发布时间】:2017-01-07 21:50:56
【问题描述】:

我正在使用 Carrierwave 版本 1.0.0rc 将文件上传和处理到 AWS S3 存储桶。这是我的环境:

导轨 4.2.0 红宝石 2.1.1 MiniMagick 4.5.1 ImageMagick 6.9.7-0

我的上传者确定要上传的原始图片是横向还是纵向,并将相应地应用处理规则。文件上传到 AWS S3 存储桶,但随后出现以下错误:

SponsorsController#create 中的 Errno::ENOENT 没有这样的文件或目录@rb_sysopen - uploads/sponsor/logo/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

私有方法似乎打开文件来比较它的宽度和高度值。当我将文件存储在本地公用文件夹中时,这工作得很好。我猜“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

我似乎找不到其他人有同样的问题。有任何想法吗?提前致谢。

【问题讨论】:

    标签: amazon-s3 imagemagick carrierwave fog minimagick


    【解决方案1】:

    我认为您需要直接引用文件,而不仅仅是路径,因为它不是本地的。比如:

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

    【讨论】:

    • MiniMagick 似乎没有文件方法。当我尝试按照您的描述使用它时出现错误。
    • 我从阅读您的代码中想到 picture 会有一个载波对象(而不是一个 minimagick 对象)。所以我想我至少会预料到载波错误。
    猜你喜欢
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    • 2015-05-14
    • 1970-01-01
    • 2021-01-09
    • 1970-01-01
    • 2015-05-11
    相关资源
    最近更新 更多