Загрузите файл WAV с помощью Paperclip и сохраните обе версии .wav и .mp3 - PullRequest
5 голосов
/ 10 сентября 2010

У меня есть приложение Rails, где люди могут использовать звуковой редактор в браузере для создания файлов WAV и загрузки их на сервер.

Я использую Paperclip для обработки загрузки звукового файла.

Я хотел бы иметь возможность конвертировать файл WAV в MP3, но сохранить оба файла.

Я читал о процессорах Paperclip, но я не уверен, как использовать их для получения обоих файлов вместо простого преобразования только в mp3.

1 Ответ

7 голосов
/ 11 сентября 2010

Хорошо, это, вероятно, не оптимально, но работает довольно хорошо.В итоге я добавил еще одно вложение в свой класс Sound для mp3 и добавил фильтр before_validation, чтобы подключиться к нему.Кроме того, поскольку у меня было несколько существующих wav-вложений, я создал метод reconvert_to_mp3 для обработки миграции существующих записей.

has_attached_file :mp3,
  :storage => :s3,
  :s3_credentials => "#{RAILS_ROOT}/config/s3.yml",
  :path => "sounds/:id/:style.:extension"

before_validation :convert_to_mp3

def reconvert_to_mp3
  wavfile = Tempfile.new(".wav")
  wavfile.binmode

  open(wav.url) do |f|
    wavfile << f.read
  end

  wavfile.close

  convert_tempfile(wavfile)
end

def convert_to_mp3
  tempfile = wav.queued_for_write[:original]

  unless tempfile.nil?
    convert_tempfile(tempfile)
  end
end

def convert_tempfile(tempfile)
  dst = Tempfile.new(".mp3")

  cmd_args = [File.expand_path(tempfile.path), File.expand_path(dst.path)]
  system("lame", *cmd_args)

  dst.binmode
  io = StringIO.new(dst.read)
  dst.close

  io.original_filename = "sound.mp3"
  io.content_type = "audio/mpeg"

  self.mp3 = io
end
...