对于S3图像,无法使用image.to_file使用Paperclip gem复制图像

时间:2010-11-23 17:09:50

标签: ruby-on-rails amazon-s3 paperclip

我遇到的问题只影响其生产环境中的此应用程序。我们有一个控制器动作,用于通过创建新对象来“克隆”文章对象,将属性设置为彼此相等,然后将图像添加到对象。

以下是控制器正在执行此操作的部分:

def clone_article
 ba = BlogArticle.find(params[:id])
 new_ba = BlogArticle.new(ba.attributes)

 ba.blog_article_images.each do |blog_img|
   new_ba.blog_article_images.build(:image => blog_img.image.to_file, :embedded => blog_img.embedded?)
 end

 new_ba.status = 'draft'
 new_ba.title = "Copy of #{ba.title}"

 if new_ba.save
     flash[:notice] = "Clone successful"
 else
    if new_ba.errors.empty?
        flash[:notice] = "Unknown error occurred while cloning the post"
    else
        error = 'Problem while cloning the post: <br>'
        new_ba.errors.each {|field, msg| error += field + " " + msg + "<br>"}
        flash[:error] = error
    end
 end
redirect_to admin_blog_articles_url

问题是,当引用服务器上的本地文件时,此脚本可以正常工作。但是在生产环境中,在S3上有图像,我们无法从原始帖子图像中获取任何图像。我认为这可能是一个时间问题,比如控制器在完成整个过程之前没有等待回形针完成将文件加载到app目录中,但我似乎无法得到任何工作。此外,我不是铁路专家,所以我有点失落。

由于

3 个答案:

答案 0 :(得分:2)

我遇到了Tempfile文件名受到严重破坏的问题,并最终得到了这种有点破解的解决方案:

ba.blog_article_images.each do |blog_img|
  new_img = blog_img.image.to_file
  new_img.instance_variable_set("@original_filename", blog_img.image.original_filename)
  def new_img.original_filename
    @original_filename
  end
  new_ba.blog_article_images.build(:image => new_img, :embedded => blog_img.embedded?)
end

它确实有效。 original_filename是Paperclip添加到File的方法,我们只是在这里覆盖它。

我没有使用本地存储进行测试,但是通过阅读Paperclip源,它应该可以正常工作。

答案 1 :(得分:1)

我正在做类似的事情。我发现只需要执行object_2.file = object_1.file,然后保存object_2就可以了。大多。 S3转移工作很花哨,但文件名因某些未知原因而受到严重破坏。

答案 2 :(得分:1)

文件被破坏,因为来自object_1的文件从S3向下复制并存储为TempFile,后者使用原始文件名在结尾处的开头和扩展名处创建自己的文件名。我也在研究同样的问题,并感谢在保存object_2之前如何更改TempFile名称的任何想法。