2013-11-16 3 views
1

Я работаю над проектом Ruby on Rails 4, который был развернут в Heroku. В принципе, пользователь должен иметь возможность загружать и загружать звуковые файлы. Загрузка файла была довольно простой. Однако загрузка была странно сложной. Я нашел несколько сообщений о переполнении стека, которые были полезны, но мне все еще нужна помощь.Загрузка звукового файла из AWS с использованием Paperclip

В конфигурации/сред/production.rb:

config.paperclip_defaults = { 
    :storage => :s3, 
    :s3_protocol => 'http', 
    :s3_credentials => { 
     :bucket => ENV['S3_BUCKET_NAME'], 
     :access_key_id => ENV['AWS_ACCESS_KEY_ID'], 
     :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY'] 
    } 
} 

Моя модель:

class Sound < ActiveRecord::Base 
    belongs_to :user 

    # for paperclip 
    has_attached_file :sound_file, 
        :s3_domain_url => "bucketname.s3.amazonaws.com", 
        :bucket => 'bucketname', 
        :s3_permissions => :public_read, 
        :encode => 'utf8' 

    # do not create a sound unless a sound file 
    # is present 
    validates_attachment_presence :sound_file 
end 

Когда пользователь нажимает на это, файл должен быть загружен:

<%= button_to "Download", download_url(sound.id), :method => :get %> 

Мой контроллер:

def download 
    @sound= Sound.find(params[:id]) 
    data = open(@sound.sound_file) 
    send_data data.read, :type => data.content_type, :x_sendfile => true 
end 

Когда я смотрю на журналы из Heroku, я вижу это сообщение об ошибке:

Parameters: {"id"=>"5"} 
Started GET "/sounds/5/download" for 76.168.22.71 at 2013-11-16 01:22:17 +0000 
Processing by SoundsController#download as HTML 
Started GET "/sounds/5/download" for 76.168.22.71 at 2013-11-16 01:22:17 +0000 
Parameters: {"id"=>"5"} 
Processing by SoundsController#download as HTML 
Completed 500 Internal Server Error in 6ms 
Completed 500 Internal Server Error in 6ms 
app/controllers/sounds_controller.rb:40:in `download' 
app/controllers/sounds_controller.rb:40:in `download' 
TypeError (no implicit conversion of Paperclip::Attachment into String): 
TypeError (no implicit conversion of Paperclip::Attachment into String): 

Любая идея, что я делаю не так?

+1

Я считаю, что open ожидает '' '' String''', и вы передаете '' 'Paperclip :: Attachment'''. – Nobita

ответ

1

Так .... я частично решить вопрос:

def download 
    @sound= Sound.find(params[:id]) 
    send_data @sound.sound_file, :disposition => 'attachment', :x_sendfile => true 
end 

Это вызывает загрузки файла, но загруженный файл представляет собой текстовый документ со следующим написано внутри:

http://s3.amazonaws.com/bucketname/sounds/sound_files/000/000/005/original/83746__braffe2__pen-writing.wav?1384493473 

Хорошей новостью является то, что Paperclip, похоже, может найти файл. Плохая новость заключается в том, что он просто возвращает текстовый документ вместо WAV-файла. Любые намеки?

UPDATE

Заменено send_data с отправки файла в контроллере:

def download 
    @sound= Sound.find(params[:id]) 
    send_file @sound.sound_file.url, 
     :filename => @sound.sound_file_file_name, 
     :type => @sound.sound_file_content_type, 
     :disposition => 'attachment', 
     :x_sendfile => true 
end 

Теперь, когда я пытаюсь загрузить из приложения на Heroku, я получаю сообщение об ошибке:

Sent file http://s3.amazonaws.com/bucketname/sounds/sound_files/000/000/005/original/83746__braffe2__pen-writing.wav?1384493473 (0.2ms) 
Sent file http://s3.amazonaws.com/bucketname/sounds/sound_files/000/000/005/original/83746__braffe2__pen-writing.wav?1384493473 (0.2ms) 
ActionController::MissingFile (Cannot read file http://s3.amazonaws.com/bucketname/sounds/sound_files/000/000/005/original/83746__braffe2__pen-writing.wav?1384493473): 
app/controllers/sounds_controller.rb:40:in `download' 

Я почти уверен, что я почти там. Любые намеки? Один из вопросов, который у меня есть, это все эти числа после «?» в пути к файлу?

1

Решено! Вот функция загрузки, которую я использовал в моем контроллере.

def download 
    @sound= Sound.find(params[:id]) 
    send_file Paperclip.io_adapters.for(@sound.sound_file).path, 
     :filename => @sound.sound_file_file_name, 
     :type => @sound.sound_file_content_type, 
     :disposition => 'attachment', 
     :x_sendfile => true 
end 
Смежные вопросы