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

4
在我的Rails 4应用程序中,我有大量存储在S3上的图像,使用Paperclip。 图像URL看起来像这样: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
1个回答

2
基本建议是不要在运行时调整图像大小,因为这可能需要一段时间,而且用户在此操作期间可能会遇到巨大的响应时间。 如果您有一些预定义的样式,最好提前生成它们,并在需要时返回。如果没有其他选择,您可以这样做。
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的文档这里,它不仅适用于图像调整大小,还可用于在图像格式之间转换、模糊处理、裁剪等等!另外,您可能会对Attachment-on-the-Fly gem感兴趣,虽然它有点过时,但可以了解如何使用convert调整图像大小。
最后一步是将调整大小的图像上传到某个S3 bucket。我假设您已经获得了aws-sdk gem和AWS::S3实例(文档可以在这里找到)。
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 服务器通信,提供您的存储桶名称和所需的键,并基本上上传一张图片并选择使其对所有人在网络上可见。请注意,还有许多其他上传选项(包括文件加密、访问权限、元数据等)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接