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 へのアップロードが機能します。

wav ファイルを mp3 に変換する私の 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

mp3_temp_pathに保存されたファイル名で tmp フォルダーに新しい mp3 ファイルを作成し、データベースにレコードを作成するという点で、すべての変換が機能しているようです。しかし、何らかの理由で、結果のファイルは 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 に答える