2016-02-26 3 views
2

У меня есть скрепка (с S3), работающая в моем приложении, для аудиофайлов. Определение модели связывает S3 с скрепкой.Paperclip без вида

# attachments 
has_attached_file :audio, storage: :s3, s3_credentials: Proc.new{|a| a.instance.s3_credentials} 
validates_attachment_content_type :audio, :content_type => [ 'audio/mpeg', 'audio/x-mpeg', 'audio/mp3', 'audio/x-mp3', 'audio/mpeg3', 'audio/x-mpeg3', 'audio/mpg', 'audio/x-mpg', 'audio/x-mpegaudio' ] 

я могу загрузить файлы через рельсы simple_form, используя этот код:

<%= simple_form_for(@sentence) do |f| %> 
    <%= f.error_notification %> 
    . 
    <%= f.input :audio, as: :file %> 
    . 
<% end %> 

Я хотел бы создать аудио с помощью фонового процесса (Resque). Этот код извлекает аудиопоток из веб-API и пытается сохранить его в существующем экземпляре модели. Это не работает.

sentences.each do |sentence| 
    sentence.audio = get_audio(sentence.sentence) 
    sentence.save 
end 

Paperclip, похоже, не знает, как обращаться с аудиопотоком.

failed: #<Paperclip::AdapterRegistry::NoHandlerError: No handler found for "\xFF\xF3\xC8\xC4\x00\x00\x00\x03H\x00\x00\x00\x00LAME3.99.5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0 

** ПРОГРЕСС **

Я сделал некоторый прогресс: написал аудиопоток в TempFile ... но теперь Paperclip жалуется кодирующая

def get_audio_tempfile(target) 
    audio = translator.speak "#{target}", :language => "#{@language_cd}", :format => 'audio/mp3', :options => 'MaxQuality' 
    tempfile = Tempfile.new("target_temp.mp3") 
    tempfile.binmode 
    tempfile.write(audio) 
    tempfile.close 
    tempfile.open 
    tempfile 
end 

Ошибка:

[paperclip] Content Type Spoof: Filename target_temp.mp320160226-32064- r391y9 (audio/mpeg from Headers, [] from Extension), content type discovered from file command: audio/mpeg. See documentation to allow this combination. 

ответ

1

Я не понимаю, что именно делает ваш метод get_audio, но вам нужно убедиться, что он возвращает дескриптор файла, например

sentence.audio = File.new(path_to_your_file, "r") 
sentence.save 

Что касается вашего TempFile подхода, убедитесь, чтобы создать его, как этот

Tempfile.new([ 'foobar', '.mp3' ]) 

Таким образом PAPERCLIP не будет жаловаться на расширение файла

0

Сводка о том, как сохранить аудио поток в Paperclip/S3, не просматривая представление.

Предполагая, что Paperclip работает и записывается на S3, для загрузки файла (с помощью Paperclip) необходимо выполнить следующие шаги: (в моем случае это процесс Resque).

Зачем это: разрешить исправление обработки переднего плана и фона или загрузить много данных.

модель

# attachments 
    has_attached_file :audio, storage: :s3, s3_credentials: Proc.new{|a| a.instance.s3_credentials} 
    validates_attachment_content_type :audio, :content_type => [ 'audio/mpeg', 'audio/x-mpeg', 'audio/mp3', 'audio/x-mp3', 'audio/mpeg3', 'audio/x-mpeg3', 'audio/mpg', 'audio/x-mpg', 'audio/x-mpegaudio' ] 

вид

<%= simple_form_for(@sentence) do |f| %> 
    <%= f.error_notification %> 
    . 
    <%= f.input :audio, as: :file %> 
    . 
<% end %> 

работа

sentence.audio = get_audio_tempfile(sentence.sentence) 
sentence.save 

get_ audio_tempfile

def get_audio_tempfile(target) 
    audio = translator.speak "#{target}", :language => "#{@language_cd}", :format => 'audio/mp3', :options => 'MaxQuality' 
    tempfile = Tempfile.new(['target_temp','.mp3']) 
    tempfile.binmode 
    tempfile.write(audio) 
    tempfile.rewind 
    tempfile 
end 

Важные примечания:

  • включают правильное расширение имени файла
  • перемотать временный файл
  • не закрыть временный файл, прежде чем использовать его

Спасибо @tobmatth для помощи с файлами.

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