将回形针附件的所有样式复制到新对象(S3)

我有一个使用Paperclip来处理图像的模型。 当图像上传时,对一些javascript裁剪进行预览,然后从所选择的裁剪中制作缩略图和预览尺寸。 给我们S3总共3张图片:

  • 原始图像
  • 预览(来自用户选择的裁剪)
  • 拇指(来自用户选择的裁剪)

附件模型中的代码是:

has_attached_file :picture, ASSET_INFO.merge( :whiny => false, :styles => { :thumb => '200>x200#', :preview => '400x300>' }, :processors => [:jcropper], :preserve_files => true ) 

我们有一些function允许用户为了自己的目的制作对象的副本,我们想要复制图像。 我以为这只是做一个简单的事情

 new_my_model.picture = original_my_model.picture if original_my_model.picture_file_name #no file name means no picture 

会完成工作,而且确实如此,但只有一点。

它正在复制图片,然后根据模型中设置的内容重新处理预览和缩略图。

我想要做的是将所有3个现有图像(原始图像,拇指图像和预览图像)复制到新对象,就像它们用于原始图像一样,然后将它们保存在S3上的适当位置,跳过resize/裁剪。

谁能指出我正确的方向? 我在网上搜索过,似乎找不到任何东西,我尝试的一切似乎都不起作用。 在原始图片上执行.dup会导致exception,因此该想法已经完成。

手动裁剪打破Paperclip的自动裁剪/resize计划。 在您想要将附件从一个模型复制到另一个模型之前,这没关系。 您有两个选择:为数据库中的每个样式保存裁剪参数,然后调用“reprocess!” 复制后( 基于这个问题) 。

我无意在数据库中保存裁剪数据,这完全没用。 我决定盲目地复制图像,直接调用S3。 不是最佳的,但有效:

 module Customizable def duplicate copy_args new_model = self.dup copy_args.each {|key, val| new_model[key] = val} new_model.save s3 = AWS::S3.new(self.image.s3_credentials) bucket = s3.buckets[self.image.s3_credentials[:bucket]] styles = self.image.styles.keys.insert(0, :original) begin styles.each do |style| current_url = self.image.path(style) current_object = bucket.objects[current_url] if current_object.exists? # actually asking S3 if object exists new_url = new_model.image.path(style) new_object = bucket.objects.create(new_url) # this is where the copying takes place: new_object.copy_from(current_object) new_object.acl = current_object.acl end end rescue Exception => err return err end return true end end 

在我的模型中:

 class Product < ActiveRecord::Base # ... has_attached_file :image, ... # ... include Customizable def customize product_id return self.duplicate({:in_sale => false}) #resetting some values to the duplicated model end # ... end