这种方法会冻结应用程序吗?

时间:2012-01-03 07:12:52

标签: ruby-on-rails-3 heroku amazon-s3

我正在使用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 :(得分:0)

我不确定你是否可以依赖于使用nginx(X-Accel-Redirect是一个nginx-ism) - heroku docs暗示它并不总是被使用。

此外,据我所知,X-Accel-Redirect仅用于重定向到服务器上的文件,而不是外部托管文件。为什么不正常重定向到S3托管文件(如果需要,使用经过身份验证的URL)?

如果您需要设置内容处理等标题,可以在上传时或之后进行。如果你使用雾来做你的s3业务你可以这样做(假设storageFog::Storage对象)

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

请注意,这会覆盖所有元数据 - 如果您有其他字段,例如Content-Type,Cache-Control等,那么请务必在此处设置它们,否则它们将丢失。

答案 1 :(得分:0)

我真的建议不要让用户通过您使用的dynos从您的应用程序下载文件来为您的页面提供服务。任何static assets should really be served from S3,然后您可以引导用户进行文件下载。

在用户下载的同时,你的dyno实际上只是将该文件提供给他们,因此无法做任何其他事情。