Rails:从S3下载图像,调整大小并上传回S3

时间:2015-03-17 07:39:32

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

在我的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})
  4. 附件类:

    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
    

1 个答案:

答案 0 :(得分: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

您可以找到convert here的文档,它不仅适用于图像大小调整,还适用于图像格式之间的转换,模糊,裁剪等等!你也可能对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服务器进行通信,提供您的存储桶名称和所需密钥,并基本上传一个图像,其中包含一个选项,以使其对网络上的每个人都可见。请注意,还有许多其他上传选项(包括文件加密,访问权限,元数据等)。