attachment_fu自定义处理器和s3:文件似乎已转换为ok,但未被保存

时间:2015-08-10 16:46:15

标签: ruby-on-rails amazon-s3 ruby-on-rails-2 attachment-fu

设定:

ruby 1.8.6
rails 2.2.2
attachment_fu - not sure (it's vendorized), but last entry in CHANGELOG is "Apr 17 2008"
aws-s3 (0.6.3)
aws-sdk (2.1.13)
aws-sdk-core (2.1.13)
aws-sdk-resources (2.1.13)

我有一个使用attachment_fu的模型,如下所示:

has_attachment :storage => :s3, 
               :path_prefix => "vip_uploads#{("_"+RAILS_ENV) if RAILS_ENV != "production"}",
               :max_size => 100.megabytes,
               :processor => :mp3

s3的设置都设置正常 - 如果我删除了processor选项,那么上传到s3就可以了。

我的mp3处理器将wav文件转换为mp3,如下所示:

module Technoweenie # :nodoc:
  module AttachmentFu # :nodoc:
    module Processors
      module Mp3Processor
        def self.included(base)
          base.send :extend, ClassMethods
          base.alias_method_chain :process_attachment, :processing
        end

        module ClassMethods
        end

      protected
        def process_attachment_with_processing
          self.convert_to_mp3
        end

        # Convert to mp3 and set some metadata
        def convert_to_mp3(options={})            
          #do the conversion with ffmpeg
          mp3_temp_path = "#{self.temp_path}.mp3"

          cmd = "ffmpeg -i #{self.temp_path} -metadata title=\"#{self.filename.gsub("\.wav","")}\" -metadata artist=\"Vip Studio Sessions\" -metadata album=\"Uploads\" -vn -ar 44100 -ac 2 -ab 320k -f mp3 #{mp3_temp_path}"

          `#{cmd}`

          #copy this file back into temp_data
          self.copy_to_temp_file(mp3_temp_path)

          #update attributes
          self.filename = self.filename.gsub(/\.wav$/,".mp3")
          self.content_type = "audio/mpeg"
          self.set_size_from_temp_path
        end
      end
    end
  end
end

所有转换内容似乎都有效,因为它在tmp文件夹中创建了一个新的mp3文件,文件名保存在mp3_temp_path中,并在数据库中创建了一条记录。但由于某种原因,生成的文件不会被推送到s3。我有一种感觉,我只需要设置一些访问器来处理temp_data或temp_file等等。我试过这个

self.temp_path = mp3_temp_path

self.temp_data = File.read(mp3_temp_path)

self.temp_path = write_to_temp_file(File.read(mp3_temp_path))

目前,正如您在我的代码中所看到的,我正在尝试这样做:

self.copy_to_temp_file(mp3_temp_path)

但它们都不起作用。这些尝试是基于查看预先存在的处理器,例如rmagick,以及查看它们的作用。他们似乎和我做同样的事情,但由于所有这些都是关于缩略图,因此很容易在翻译中丢失一些东西。

任何人都能看到我失踪的东西吗?谢谢,Max

1 个答案:

答案 0 :(得分:1)

好的,回答我自己的问题 - 新的一天带来的惊喜真是太棒了。我突然想到更仔细地查看attachment_fu源代码,其中我注意到了这一点......

    def after_process_attachment
      if @saved_attachment
        if respond_to?(:process_attachment_with_processing) && thumbnailable? && !attachment_options[:thumbnails].blank? && parent_id.nil?
          temp_file = temp_path || create_temp_file
          attachment_options[:thumbnails].each { |suffix, size| create_or_update_thumbnail(temp_file, suffix, *size) }
        end
        save_to_storage
        @temp_paths.clear
        @saved_attachment = nil
        callback :after_attachment_saved
      end
    end

我没有将此实例变量@saved_attachment设置为true(或truthy),因此它不会继续save_to_storage。它有点失败 - 记录仍然愉快地保存到数据库,它只是不存储文件。

总之,答案是,如果我对产生的mp3感到满意(即首先是mp3,或者我成功将其转换为mp3),那么我需要设置{{1}在我的处理器中。