回形针处理器不更改文件内容

时间:2014-02-18 07:03:46

标签: ruby-on-rails paperclip

我正在尝试使用rails中的Paperclip处理器转换上传的文本文件附件的行。我可以使用调试器验证我的处理器是否被调用,但是附加的文件是我的原始文件,而不是处理器写入的文件。这是我的处理器:

module Paperclip
  class Utf8 < Processor
    def initialize(file, options={}, attachment=nil)
      super
      @file           = file
      @attachment     = attachment
      @current_format = File.extname(@file.path)
      @format         = options[:format]
      @basename       = File.basename(@file.path, @current_format)
    end

    def make
      @file.rewind
      tmp = Tempfile.new([@basename, @format])

      IO.foreach(@file.path) do |line|
        tmp << line.encode('UTF-8', 'binary', invalid: :replace, undef: :replace, replace: '')
      end

      tmp.flush
      tmp
    end
  end
end

这是我的模特:

class List < ActiveRecord::Base
  has_attached_file :file,
                    storage: :s3,
                    s3_credentials: Rails.root.join('config', 'aws.yml'),
                    bucket: Rails.application.config.s3_bucket,
                    processors: [:utf8],
                    styles: {
                        utf8: {
                            format: 'txt'
                        }
                    }
end

知道我做错了什么吗?据我了解,从make返回的文件是回形针附加到模型的内容。 s3可能与此有关吗?

1 个答案:

答案 0 :(得分:1)

找到解决方案:paperclip将每个样式保存为单独的文件。要覆盖原始文件而不是创建新文件,我必须将模型更改为:

class List < ActiveRecord::Base
  has_attached_file :file,
                    storage: :s3,
                    s3_credentials: Rails.root.join('config', 'aws.yml'),
                    bucket: Rails.application.config.s3_bucket,
                    processors: [:utf8],
                    styles: {
                        original: { # specifying original style here causes the original file to be overwritten
                            format: 'txt'
                        }
                    }
end