【问题标题】:Rails: Download images from S3, resize and upload back to S3Rails:从 S3 下载图像,调整大小并上传回 S3
【发布时间】:2015-05-19 13:26:32
【问题描述】:

在我的 Rails 4 应用程序中,我使用 Paperclip 在 S3 上存储了大量图像。图片网址看起来像http://s3.amazonaws.com/bucketname/files/images/000/000/012/small/image.jpg?1366900621

给定以下附件类:

  1. 如何从 S3 下载图像并存储在本地?
  2. 那么如何调整本地存储的图片大小
  3. 将调整大小的图像上传到另一个没有 Paperclip 的 S3 存储桶(在路径 s3/newbucket/images/{:id}/{imagesize.jpg})

附件类:

class Image < ActiveRecord::Base
  has_attached_file :file, styles: { thumbnail: '320x320', icon: '64x64', original: '1080x1080' }
  validates_attachment :file, presence: true, content_type: { content_type: /\Aimage\/.*\Z/ }
end

【问题讨论】:

    标签: ruby-on-rails amazon-s3 paperclip image-resizing aws-sdk


    【解决方案1】:

    基本建议是不要即时调整图像大小,因为这可能需要一段时间,并且您的用户在此操作期间可能会遇到很长的响应时间。如果您有一些预定义的样式集,最好提前生成它们并在需要时返回。

    好吧,如果没有其他选择,您可以这样做。

    def download_from_s3 url_to_s3, filename
      uri = URI(url_to_s3)
      response = Net::HTTP.get_response(uri)
      File.open(filename, 'wb'){|f| f.write(response.body)}
    end
    

    在这里,我们基本上下载了位于给定 URL 的图像并将其保存为本地文件。可以通过几种不同的方式调整大小(这取决于您是否要将下载的文件作为Paperclip 附件提供)。 这里最常见的方法是使用image-magick 及其convert 命令行脚本。这是一个将图像大小调整为30 宽度的示例:

    convert  -strip -geometry 30 -quality 100 -sharpen 1 '/photos/aws_images/000/000/015/original/index.jpg' '/photos/aws_images/000/000/015/original/S_30_WIDTH__q_100__index.jpg' 2>&1 > /dev/null
    

    您可以找到converthere 的文档,它不仅适用于调整图像大小,还适用于图像格式之间的转换、模糊、裁剪等等!您也可能对Attachment-on-the-Fly gem 感兴趣,这似乎有点过时,但对如何使用convert 调整图像大小有一些见解。

    最后一步是将调整大小的图像上传到S3 bucket。我假设您已经拥有 aws-sdk gem 和 AWS::S3 实例(可以找到文档 here)。

    def upload_to_s3 bucket_name, key, file
      s3 = AWS::S3.new(:access_key_id => 'YOUR_ACCESS_KEY_ID', :secret_access_key => 'YOUR_SECRET_ACCESS_KEY')
      bucket = s3.buckets[bucket_name]
      obj = bucket.objects[key]
      obj.write(File.open(file, 'rb'), :acl => :public_read)
    end
    

    因此,您在这里获得了一个 AWS::S3 对象以与 S3 服务器通信,提供您的存储桶名称和所需的密钥,并基本上上传一个带有选项的图像,以使其对网络上的每个人都可见。请注意,还有许多额外的上传选项(包括文件加密、访问权限、元数据等等)。

    【讨论】:

      猜你喜欢
      • 2023-04-11
      • 1970-01-01
      • 2011-09-18
      • 2021-12-09
      • 2011-10-04
      • 1970-01-01
      • 2012-08-19
      • 2015-04-08
      • 2015-11-18
      相关资源
      最近更新 更多