Как обслуживать файлы S3 из приложения Rails?

#heroku #amazon-s3 #ruby-on-rails-3.1 #content-disposition

#heroku #amazon-s3 #ruby-on-rails-3.1 #содержимое-расположение

Вопрос:

Я пытаюсь разрешить пользователям загружать файл S3, щелкнув левой кнопкой мыши ссылку. Обычно они должны были бы сделать это, щелкнув правой кнопкой мыши и сохранив как.

Я заглянул в http://apidock.com/rails/ActionController/DataStreaming/send_file но не уверен, что это то, чего я хочу.

Эта статья http://www.jtricks.com/bits/content_disposition.html в основном показывает, как это можно сделать, настроив Apache. Тем не менее, мы используем Heroku.

Кто-нибудь раньше использовал Content-Disposition для обслуживания файлов из S3? Также интересно, занимает ли это весь веб-процесс (Dyno)? Или если весь процесс происходит на сервере S3 вместо этого?

Я пытался:

 send_file 'http://some_bucket_name.s3.amazonaws.com/uploads/users/28/songs/88/test.mp3', :type => 'audio/mp3', :disposition => 'attachment'
  

И я получаю:

 Cannot read file http://some_bucket_name.s3.amazonaws.com/uploads/users/28/songs/88/test.mp3
  

Файл действительно существует. Если я вручную перейду к URL. Файл воспроизводится нормально.

Ответ №1:

Это работает для Rails 3. В вашем контроллере:

 response.headers['Content-Disposition'] = "attachment; filename=#{original_filename}"
self.response_body = proc { |response, output|
  AWS::S3::S3Object.stream(path, 'some_bucket_name') { |segment|
    output.write segment
  }
}
  

В вашем случае:

 original_filename = 'test.mp3'
path = '/uploads/users/28/songs/88/test.mp3'
  

Комментарии:

1. Он возвращает: uninitialized constant PagesController::AWS . У меня установлен AWS gem, и в моем gemfile

2. Кстати, я делаю это в PagesController. Есть какие-нибудь идеи, почему возникает эта ошибка?

3. Ммм … попробуйте ::AWS::S3::S3Object и т.д. (обратите внимание, что AWS имеет префикс ::)

Ответ №2:

попробуйте отправить данные AWS::S3.new.buckets[‘music’].objects[«путь /к / вашему/файлу.mp3»].read, имя файла: «some_file_name.mp3»