Будет ли этот подход заморозить приложение? - PullRequest
0 голосов
/ 03 января 2012

Я использую Heroku и Amazon S3 для хранения.

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

В одномиз моих контроллеров у меня есть:

response.content_type = 'application/octet-stream'
response.headers['Content-Disposition'] = "attachment; filename=@audio.filename"
response.headers['X-Accel-Redirect'] = @audio.encoded_file_url
render :nothing => true

@audio.encoded_file_url возвращает http://bucket_name.s3.amazonaws.com/uploads/19/test.mp3.

, который, кажется, работает на моей локальной машине.Тем не менее, мне интересно, если этот подход заблокирует весь обработчик HTTP-запросов, замораживая приложение до завершения загрузки.

В Heroku обработчиком HTTP-запроса является один Dyno.И иметь несколько Dynos дорого.

Ответы [ 2 ]

0 голосов
/ 03 января 2012

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

Пока пользователь загружает файл, ваш динамо фактически просто передает ему этот файл и, таким образом, не может ничего делать.

0 голосов
/ 03 января 2012

Я не уверен, что вы можете положиться на используемый nginx (X-Accel-Redirect - это nginx-ism) - heroku docs подразумевает, что он не всегда используется.

Кроме того, X-Accel-Redirect, насколько мне известно, предназначен только для перенаправления файлов, фактически находящихся на сервере, а не для внешних файлов. Почему бы не выполнить обычное перенаправление на размещенный файл S3 (при необходимости используя аутентифицированный URL)?

Если вам нужно установить заголовки, такие как расположение контента, это можно сделать во время загрузки или после нее. Если вы используете туман для ведения бизнеса в s3, вы можете сделать это следующим образом (при условии, что storage является Fog::Storage объектом)

storage.copy_object("your_bucket", "filename","your_bucket","filename", "x-amz-metadata-directive" => 'REPLACE', 'Content-Disposition' => '...')

Обратите внимание, что при этом перезаписываются все метаданные - если у вас есть другие поля, такие как Content-Type, Cache-Control и т. Д., Обязательно установите их здесь, иначе они будут потеряны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...