2016-02-26 58 views
2

我的回形針(帶有S3)在我的應用程序中工作,用於音頻文件。模型定義連接S3和回形針。沒有視圖的回形針

# 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)處理音頻。此代碼從Web API檢索音頻流並嘗試將其保存到現有的模型實例。這是行不通的。

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

回形針似乎不知道如何處理音頻流。

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 

** **進展

我取得了一些進展:寫的音頻流的將它視爲......但現在回形針抱怨編碼

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.new([ 'foobar', '.mp3' ]) 

創建這樣的回形針不會抱怨文件擴展名

0

如何保存音頻摘要流到Paperclip/S3而不通過視圖。

假設回形針工作並寫入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幫助解決文件問題。