我正在使用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很贵。
答案 0 :(得分:0)
我不确定你是否可以依赖于使用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等,那么请务必在此处设置它们,否则它们将丢失。
答案 1 :(得分:0)
我真的建议不要让用户通过您使用的dynos从您的应用程序下载文件来为您的页面提供服务。任何static assets should really be served from S3,然后您可以引导用户进行文件下载。
在用户下载的同时,你的dyno实际上只是将该文件提供给他们,因此无法做任何其他事情。