ruby-on-rails – Rails:从S3下载图像,调整大小并上传回S3
在我的Rails 4应用程序中,我使用Paperclip在S3上存储了大量图像.图片网址看起来像
http://s3.amazonaws.com/bucketname/files/images/000/000/012/small/image.jpg?1366900621.
给出以下附件类: >如何从S3下载图像并在本地存储? 附件类: 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 解决方法
基本建议不是动态调整图像大小,因为这可能需要一段时间,并且您的用户可能会在此操作期间遇到大量响应时间.如果您有一些预定义的样式集,那么提前生成它们并在需要时返回它是明智的.
那么,如果没有其他选择,这就是你可以做的. 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附件提供). 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 你可以找到转换here的文档,它不仅适用于图像大小调整,还适用于图像格式之间的转换,模糊,裁剪等等!另外你可能会对Attachment-on-the-Fly gem感兴趣,这看起来有点过时,但对如何使用转换调整图像大小有一些见解. 最后一步是将调整大小的图像上传到某个S3存储桶.我假设你已经有了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服务器通信,提供您的存储桶名称和所需的密钥,并基本上传一个带有选项的图像,以使其对Web上的每个人都可见.请注意,还有许多其他上载选项(包括文件加密,访问权限,元数据等). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |