以前:创建或更新后,在纸条附件上运行模型方法(造纸回调似乎不起作用)

编辑(那天晚些时候)我发现了我的问题。显然,处理器可以与已更新的文件一起使用,但直到处理后才保存任何文件。我将zip :: zipfile更改为打开“文件”而不是“ artivement.path”,因为附件路径实际上还没有任何东西。这解决了第一个问题。现在,我还有其他需要追踪的问题。但是下面的答案主要是正确的。

编辑(1/31/2011):

因此,我采取了建议,为我的附件创建处理器,以执行所有必要的操作。到目前为止,看起来应该有效。显然,处理器启动并完成所有初始化的工作。但是,当我得到要访问上传的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和Paperclip开发一个照片库应用程序。管理员能够创建画廊并上传包含一堆图像的zip文件。

我想发生的事情:

  1. 输入图库信息和zip文件以上传到表单中。
  2. 点击“创建画廊”按钮。
  3. 表单帖子,画廊保存和zip文件上传。
  4. 上传zip文件后,运行该方法:extract_photos(btw,此代码工作)。 4.A.在此方法的末尾,zip文件被破坏。
  5. 管理员将重定向到图库页面,其中包含所有照片(画廊has_many照片)。

我试图使这项工作几种不同的方式。

在之前,我创建了一个控制器方法,该方法将允许管理员单击一个启用:extract_photos方法的链接。这在我的计算机上起作用,但是由于某种原因,服务器在客户端的计算机上将其布置不足。所以没关系。另外,我认为这是一种丑陋的方式。

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

我在PaperClip GitHub页面上检查了回调方法,并讨论了回调:

在处理后步骤之前和之后,PaperClip用几个回调回到模型,从而使模型更改或取消处理步骤。回调为“ tre_post_process”和“ after_post_process”(在每个附件的处理之前和之后称为),以及特定于附件的“ tof tofpost_process”和“ facterpost_process”。回调的目的是尽可能接近正常的ActiverEcord回调,因此,如果您在过滤器之前返回false(具体 - 返回零不相同),则后处理步骤将停止。在后过滤器中返回false不会停止任何内容,但是您可以在必要时访问模型和附件。

我已经尝试使用tre_post_process和after_post_process,但是找不到运行该过程的文件,因此该文件显然不会在这些方法被调用时上传(我认为这很奇怪)。此外,当我尝试foreforpost_process和AfterPost_process时,我会得到一个nomethoderror。

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

更新

我尝试了下面的代码,将我的提取方法代码转移到处理器的制造方法中。我比以前尝试编写处理器要走得更远,但这仍然是不做的。我尝试打开上传文件以进行处理后立即引发异常,说该文件不存在。命名方案是正确的,一切都是正确的,但是 仍然 在触发过程之前,没有什么都没有上传。有人知道为什么会发生这种情况吗?

有帮助吗?

解决方案

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

在您的模型中声明纸条内容时添加自定义处理器

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

然后编写您自己的处理器并将其放置为Config/Initializer:

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

我正在使用一个自定义处理器来处理与您在中间进行大量处理和转换的操作相似的事情,并且似乎运行良好。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top