我正在尝试使用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可能与此有关吗?
答案 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