回形针处理器无法找到它的文件

问题描述:

原名:运行在一个回形针附件的模型方法后,创建或更新(回形针回调似乎不工作)回形针处理器无法找到它的文件

编辑(当天晚些时候) 我想通出我的问题。处理器显然与更新的文件一起工作,但在处理之后才保存任何文件。我改变了我的Zip :: ZipFile来打开'file'而不是'attachment.path',因为附件路径实际上并没有保存任何东西。这解决了第一个问题。现在我还有其他问题需要追踪。但下面的答案大部分是正确的。

编辑(2011年1月31日):

所以我采取了建议创建我的执着处理器,该处理器将执行所有必要的行动。到目前为止,它看起来应该起作用;处理器启动并显然执行所有初始化操作。但是,当我得到要访问上载的zip文件的位置时,出现错误,指出无法找到该文件。我的处理器的代码如下:

class Extractor < Processor 
    attr_accessor :resolution, :whiny 
    def initialize(file, options = {}, attachment = nil) 
     super 
     @file = file 
     @whiny = options[:whiny].nil? ? true : options[:whiny] 
     @basename = File.basename(@file.path, File.extname(@file.path)) 
     @attachment = attachment 
     @instance = attachment.instance 
    end 
    def make 
     # do your conversions here, you've got @file, @attachment and @basename to work with 
     export_path = attachment.path.gsub('.zip', '_content') 

     Zip::ZipFile.open(attachment.path) { |zip_file| 
     zip_file.each { |image| 
      image_path = File.join(export_path, image.name) 
      FileUtils.mkdir_p(File.dirname(image_path)) 
      unless File.exist?(image_path) 
      zip_file.extract(image, image_path) 
      # ..stuff that it does.. 
      end 
     } 
     } 
     # clean up source files, but leave the zip 
     FileUtils.remove_dir(export_path) 


     # you return a file handle which is the processed result 
     dst = File.open result_file_path 
    end 
end 

这里是错误的,我得到的内容:

Zip::ZipError in GalleriesController#create 

File /home/joshua/railscamp/moments_on_three/public/assets/archives/delrosario.zip not found 

Rails.root: /home/joshua/railscamp/moments_on_three 
Application Trace | Framework Trace | Full Trace 

config/initializers/extractor.rb:16:in `make' 
app/controllers/galleries_controller.rb:32:in `new' 
app/controllers/galleries_controller.rb:32:in `create' 

Request 

Parameters: 

{"utf8"=>"✓", 
"authenticity_token"=>"0s4L4MrlqjDTMjzjgkUdvUxeHklZNOIShDhT6fgOICY=", 
"gallery"=>{"name"=>"DelRosario", 
"public"=>"0", 
"owner_id"=>"1", 
"shoot_date(1i)"=>"2011", 
"shoot_date(2i)"=>"1", 
"shoot_date(3i)"=>"31", 
"category_id"=>"1", 
"archive"=>#<ActionDispatch::Http::UploadedFile:0x00000004148d78 @original_filename="delrosario.zip", 
@content_type="application/zip", 
@headers="Content-Disposition: form-data; name=\"gallery[archive]\"; filename=\"delrosario.zip\"\r\nContent-Type: application/zip\r\n", 
@tempfile=#<File:/tmp/RackMultipart20110131-9745-14u347v>>}, 
"commit"=>"Create Gallery"} 

从我可以告诉它寻找合适的地方的文件,但该文件似乎还没有上传,但无法访问它。据我所知,Paperclip在尝试处理附件之前已足够聪明,可以知道并等待附件上传。任何人都可以发现我在这里做错了吗?

非常感谢。

旧的东西:

我正在开发使用Rails 3和回形针照片库应用程序。管理员可以创建一个图库并上传一个包含一系列图像的zip文件。

我想什么发生:

  1. 进入画廊的信息和zip文件上传到表单。
  2. 点击“创建图库”按钮。
  3. 表单文章,图库保存和zip文件被上传。
  4. 上传zip文件后,运行方法:extract_photos(顺便说一句,此代码 工程)。 4.a.在该方法结束时,zip文件被破坏。
  5. 管理员被重定向到画廊页面,其中的所有照片(其中 图库has_many照片)。

我试过让这个工作有几种不同的方式。

之前,我创建了一个控制器方法,该方法允许管理员单击运行:extract_photos方法的链接。这在我的计算机上工作,但由于某种原因,服务器无法在客户端的计算机上路由该服务器。所以这是不行的。另外我认为这是一个丑陋的做法。

最近,我尝试使用回调方法。 after_save不起作用,因为它显然会中断POST表单,并且文件没有上传,并且:extract_photos方法找不到该文件。

我检查了回形针GitHub的页面上回调方法,并谈到了回调:

前和后处理 步骤之后,回形针回调到 模型有一些回调,允许 模型更改或取消 处理步骤。回调是 “before_post_process”和 “after_post_process”(这和之前的 处理每个附接之后被称为 ),并且附接 特定 “beforepost_process”和 “afterpost_process”。该回调 旨在尽可能接近正常 ActiveRecord的回调可能,因此 如果返回false(具体 - 返回nil是不一样的)在 过滤器前,后处理 一步将暂停。在过滤器不会暂停任何操作后返回 , ,但您可以根据需要访问模型和 附件。

我使用before_post_process和after_post_process试过,但它无法找到运行过程中的文件,所以很明显是没有得到的时候上传的文件将这些方法获取调用(我认为这是奇怪)。另外,当我尝试beforepost_process和afterpost_process之后,我得到一个NoMethodError。

那么,如何在创建或更新附件时调用附件的方法,但在文件上传并放置在正确的位置之后呢?

UPDATE

我尝试下面的代码,移动我提取方法的代码到处理器的化妆方法。我试图编写一个处理器的时间比以前更远了,但它仍然是一个不行。当我尝试打开上传的文件进行处理时,该进程会立即抛出异常,并说该文件不存在。命名方案是正确的,并且一切正常,但仍然在进程被触发之前没有任何内容被上传。有谁知道为什么会发生这种情况?

您可以编写自己的处理器来完成此操作。

在模型

声明回形针的东西时,添加自定义处理器

has_attached_file :my_attachment, { 
    :styles => {:original => {:processors => [:my_processor]}} 
    }.merge(PAPERCLIP_SETTINGS) 

然后写你自己的处理器,并把它配置/初始化:

module Paperclip 
    class MyProcessor < Processor 
    attr_accessor :resolution, :whiny 
    def initialize(file, options = {}, attachment = nil) 
     super 
     @file = file 
     @whiny = options[:whiny].nil? ? true : options[:whiny] 
     @basename = File.basename(@file.path, File.extname(@file.path)) 
     @attachment = attachment 
    end 
    def make 
     # do your conversions here, you've got @file, @attachment and @basename to work with 

     # you return a file handle which is the processed result 
     dst = File.open result_file_path 
    end 
    end 
end 

我用一个自定义的处理器的事类似于你正在做的很多处理和文件转换的中间,它似乎工作得很好。

+0

你还能访问父模型和处理器中的所有东西吗?其中一个主要功能是:使用当前正在提取的文件从库中构建一系列依赖对象。处理器上的文档实际上并不存在。 – 2011-01-27 21:55:02