我正在创建一个托管在Heroku上的Rails应用程序,该应用程序允许用户基于原始JPG即时生成动画GIF,该原始JPG托管在网络中的某个位置(可以将其视为裁剪大小的应用程序)。我尝试了Paperclip,但是AFAIK无法处理动态生成的文件。我正在使用aws-sdk
gem,这是我的控制器的代码片段:
im = Magick::Image.read(@animation.url).first
fr1 = im.crop(@animation.x1,@animation.y1,@animation.width,@animation.height,true)
str1 = fr1.to_blob
fr2 = im.crop(@animation.x2,@animation.y2,@animation.width,@animation.height,true)
str2 = fr2.to_blob
list = Magick::ImageList.new
list.from_blob(str1)
list.from_blob(str2)
list.delay = @animation.delay
list.iterations = 0
这是用于基本创建两帧动画的。 RMagick可以使用以下代码在我的开发计算机中生成GIF:
list.write("#{Rails.public_path}/images/" + @animation.filename)
我尝试将
list
结构上传到S3:# upload to Amazon S3
s3 = AWS::S3.new
bucket = s3.buckets['mybucket']
obj = bucket.objects[@animation.filename]
obj.write(:single_request => true, :content_type => 'image/gif', :data => list)
但是我在
size
中没有可用于指定该方法的RMagick::ImageList
方法。我尝试将GIF“预编译”为另一个RMagick::Image
:anim = Magick::Image.new(@animation.width, @animation.height)
anim.format = "GIF"
list.write(anim)
但是Rails崩溃并出现分段错误:
/path/to/my_controller.rb:103: [BUG] Segmentation fault ruby 1.8.7 (2010-01-10 patchlevel 249) [universal-darwin11.0]
Abort trap: 6
第103行对应于
list.write(anim)
。因此,目前我不知道如何执行此操作,感谢收到的任何帮助。
最佳答案
按照@mga在回答原始问题时的要求...
基于非文件系统的方法非常简单
rm_image = Magick::Image.from_blob(params[:image][:datafile].read)[0]
# [0] because from_blob returns an array
# the blob, presumably, can have multiple images data in it
a_thumbnail = rm_image.resize_to_fit(150, 150)
# just as an example of doing *something* with it before writing
s3_bucket.objects['my_thumbnail.jpg'].write(a_thumbnail.to_blob, {:acl=>:public_read})
瞧!读取上传的文件,使用RMagick对其进行操作,然后将其写入s3,而无需接触文件系统。
关于ruby-on-rails - 将RMagick生成的文件从Heroku上传到Amazon S3,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8349530/