1

设置:

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)并查看它们的功能。他们似乎和我做同样的事情,但由于他们都是关于缩略图的,所以很容易在翻译中丢失一些东西。

谁能看到我错过了什么?谢谢,马克斯

4

1 回答 1

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),那么我需要@saved_attachment = true在我的处理器中进行设置。

于 2015-08-11T08:51:28.520 回答