2015-08-10 1 views
1

Setup:attachment_fu пользовательский процессор и s3: файл, кажется, быть преобразованы в порядке, но не сохраняется

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 

Все вещи преобразования, кажется, работает, в том, что он делает новый mp3 файл в папке TMP, с имя файла сохранено в 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, и о том, что они делают. Они, кажется, делают то же самое, что и я, но поскольку все они посвящены thumbnailing, легко потерять что-то в переводе.

Может ли кто-нибудь увидеть, что мне не хватает? спасибо, Макс

+0

Просто дикий удар в темном/случайном порядке ... Все эти https://github.com/technoweenie/attachment_fu/tree/master/lib/technoweenie/attachment_fu/процессоры имеют метод класса 'with_image'. .. вам нужен один из них для этого? –

+0

Хм, я попробовал добавить метод класса with_image, который просто возвращает 'true', без изменений. –

+0

Кроме того, 'with_image' вызывается методом' process_attachment_with_processing' в этих других процессорах, я не думаю, что в этом есть что-то особенное. –

ответ

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 к истинным (или truthy), так что не было save_to_storage. Это отчасти терпит неудачу - запись по-прежнему счастливо сохраняется в базе данных, она просто не сохраняет файл.

В заключение я ответил, что если я доволен полученным mp3 (т. Е. Это был mp3 в первую очередь, или я успешно конвертировал его в mp3), тогда мне нужно установить @saved_attachment = true в мой процессор.

Смежные вопросы