Загрузка: Скрепка, S3, Heroku и x_sendfile - PullRequest
0 голосов
/ 30 июня 2011

У меня есть довольно распространенная установка.

Мое приложение rails 3 размещено на Heroku, и я использую Paperclip для управления загрузкой файлов, видео и изображений со всеми файлами, сохраненными на Amazon S3.Модель, к которой прикреплены файлы - это Entry, а сами вложения называются «media».Итак, у меня есть скрепка, настроенная так:

class Entry < ActiveRecord::Base
  has_attached_file :media, {:storage=>:s3,
                             :bucket=>"mybucketname",
                             :s3_credentials=> <credentials hash>}

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

Ссылка для скачивания на странице:

<p><%= link_to "Download", download_entry_path(entry) %></p>

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

def download
  @entry = Entry.find(params[:id])
  if @entry.media.file?
    send_file @entry.media.to_file, :type => @entry.media_content_type, 
                                    :disposition => 'attachment', 
                                    :filename => @entry.media_file_name,
                                    :x_sendfile => true
  else
    flash[:notice] = "Sorry, there was a problem downloading this file"
    redirect_to report_path(@entry.report) and return      
  end  
end

Поскольку некоторые из загрузок будут очень большими, я бы хотел перенести загрузку на сервер, чтобы избежать связывания с динамо.Вот почему я использую опцию x_sendfile.Тем не менее, я не думаю, что он настроен правильно: в журнале heroku я вижу это:

2011-06-30T11:57:33+00:00 app[web.1]: X-Accel-Mapping header missing
2011-06-30T11:57:33+00:00 app[web.1]: 
2011-06-30T11:57:33+00:00 app[web.1]: Started GET "/entries/7/download" for 77.89.149.137 at 2011-06-30 04:57:33 -0700
2011-06-30T11:57:33+00:00 app[web.1]: ### params = {"action"=>"download", "controller"=>"entries", "id"=>"7"}
2011-06-30T11:57:33+00:00 heroku[router]: GET <my-app>/entries/7/download dyno=web.1 queue=0 wait=0ms service=438ms status=200 bytes=94741

Сообщение «X-Accel-Mapping header отсутствует» говорит о том, что что-то не так, но я нене знаю что.По сути, я не знаю, выполняет ли сервер nginx heroku автоматическую загрузку файлов, и если нет, то как мне это сказать, и я не могу найти в документации heroku ничего об этом (возможно, я искал не то).

Кто-нибудь может меня поправить?Благодарен за любой совет - max

1 Ответ

3 голосов
/ 30 июня 2011

Я не уверен, почему вы отправляете файлы через сервер. Если они хранятся на S3, почему бы просто не ссылаться прямо на них?

<%= link_to "Download", entry.media.url %>

Таким образом, загрузки полностью обходят ваш сервер Heroku.

...