2012-01-03 21 views
0

我正在使用Heroku和Amazon S3进行存储。此方法是否会冻结应用程序?

我试图使下载对话框出现的音频文件,而不是浏览器播放。

在我的控制器之一,我有:

response.content_type = 'application/octet-stream' 
response.headers['Content-Disposition'] = "attachment; [email protected]" 
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是昂贵的。

+0

它将为整个下载块,我相信S3支持设置上传在内容处置,那么你可以直接链接到的文件,仍然可以得到的对话框 – house9 2012-01-03 07:40:57

+0

我不明白。如果这些文件已经在S3上了,该怎么办?即在上传过程中没有设置内容处置设置 – 2012-01-03 08:15:06

回答

0

我不确定你可以依靠nginx被使用(X-Accel-Redirect是一个nginx主题) - 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' => '...') 

注意,这将覆盖所有元数据 - 如果你有其他领域,如内容类型,缓存 - 控制等,然后确保将它们设置在这里,否则它们将丢失。

+0

如果我正常重定向到S3托管文件,它将让浏览器播放音频文件而不是弹出下载对话框。或者我错过了什么? – 2012-01-03 08:01:49

+0

当您在s3中存储文件时,您可以设置内容处置标题 – 2012-01-03 09:11:57

+0

这仍然可以使用S3上已经存在的文件来完成吗? – 2012-01-03 09:46:23

0

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

虽然用户下载,您DYNO有效刚刚喂养文件给他们,从而无法做任何事情。