使用Pyramid,nginx,X-Accel-Redirect Header下载pdf作为下载

时间:2012-10-19 05:09:31

标签: python nginx pyramid

我希望用户能够点击这样的链接:

<a href="/download?file=123">download</a>

让Pyramid 1.2.7应用程序像这样处理视图

@view_config(route_name='download')
def download(request):
    file_id = request.GET['file']
    filename = get_filename(file_id)
    headers = request.response.headers
    headers['Content-Description'] = 'File Transfer'
    headers['Content-Type'] = 'application/force-download'
    headers['Accept-Ranges'] = 'bytes'
    headers['X-Accel-Redirect'] = ("/path/" + filename + ".pdf")
    return request.response

我的nginx配置看起来像这样

location /path/ {
 internal;
 root /opt/tmp; 
}

这一切都有效,但浏览器显示pdf已下载,而不是浏览器显示一堆PDF垃圾。

如何设置我的Pyramid视图以使浏览器做正确的事情?

1 个答案:

答案 0 :(得分:7)

如果您想表明网络浏览器应该下载资源而不是显示它,请尝试使用Content-Disposition标题as described in RFC 6266。例如,以下响应标头将告诉浏览器下载文件:

Content-Disposition: attachment

您还可以通过此标题指定下载文件的文件名(如果它与URL中的最后一个路径组件不同):

Content-Disposition: attachment; filename=foo.pdf

查看Nginx documentation,此响应标头应与您正在使用的X-Accel-Redirect功能配合使用。