我有一个视图,使用nginx'X-Accel-Redirect
标头保护某些敏感文件免受公共下载。我的网址如下所示:
url(r'^dl/f/(?P<pk>\d+)/(?P<filename>[^/]+)$', 'file_download.views.download', name='download-filename'),
pk
是数据库中文件对象的主键,filename
是文件名,它匹配除正斜杠之外的任何内容。它主要是在那里,以便浏览器知道文件名,以防用户想要保存它。请注意,没有终端斜杠。
当我在浏览器中打开匹配的URL时,Django会将其重定向到相同的URL并附加斜杠。该文件显示在浏览器中(它是PDF),但如果我想保存它,浏览器会建议使用通用的“download.pdf”而不是文件名。
我不想为一般情况禁用APPEND_SLASH
,但是我可以以某种方式解决这个案例吗?
/ edit:遗憾的是,我无法使用Content-Disposition: attachment
标头,因为所有其他文件的服务也没有该标头,并且需要保护受保护文件和不受保护文件的一致行为。
答案 0 :(得分:1)
我不知道文档中的位置/是否存在,但我认为在网址中添加扩展名会阻止此行为,因此请使用some-filename/
代替some-filename.pdf
而不是Content-Disposition
。相应地,urlpattern)。
但是,我对此并不完全确定。实际上,您的主要问题似乎是下载的文件名设置不正确,并且可以修复,而不会以某种方式弄乱URL。只需存储响应而不是立即返回响应,然后更改response = HttpResponse(mimetype='application/pdf')
response['Content-Disposition'] = 'attachment; filename=somefilename.pdf'
标题:
\.\w{3,4}
<强>更新强>
关于评论中的两点:
urlpattern可以接受通配符扩展名{{1}}。
'附件'是强制下载的原因。 'inline'可用于在浏览器中加载文件。文件名可以以任何方式断言。