在我的Rails 4应用程序中,我使用Paperclip在S3上存储了大量图像。图片网址看起来像http://s3.amazonaws.com/bucketname/files/images/000/000/012/small/image.jpg?1366900621。
给出以下附件类:
附件类:
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
答案 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
服务器进行通信,提供您的存储桶名称和所需密钥,并基本上传一个图像,其中包含一个选项,以使其对网络上的每个人都可见。请注意,还有许多其他上传选项(包括文件加密,访问权限,元数据等)。