我在Django中使用ReportLab生成一些pdf。我跟着并试验了给this question的答案,并意识到其中的双引号没有意义:
response['Content-Disposition'] = 'inline; filename=constant_"%s_%s".pdf'\
% ('foo','bar')
提供文件名constant_-foo_bar-.pdf
response['Content-Disposition'] = 'inline; filename=constant_%s_%s.pdf' \
% ('foo','bar')
提供文件名constant_foo_bar.pdf
这是为什么?它只是与文件系统的slug-esque sanitisation有关吗?
答案 0 :(得分:2)
从this question的研究看来,它实际上是浏览器进行编码/转义。我使用cURL
来确认Django本身不会逃避这些标头。首先,我设置了一个最小的测试视图:
# views.py
def index(request):
response = render(request, 'template.html')
response['Content-Disposition'] = 'inline; filename=constant"a_b".html'
return response
然后跑了:
carl@chaffinch:~$ HEAD http://localhost:8003
200 OK
Date: Thu, 16 Aug 2012 19:28:54 GMT
Server: WSGIServer/0.1 Python/2.7.3
Vary: Cookie
Content-Type: text/html; charset=utf-8
Client-Date: Thu, 16 Aug 2012 19:28:54 GMT
Client-Peer: 127.0.0.1:8003
Client-Response-Num: 1
Content-Disposition: inline; filename=constant"a_b".html
查看标题:filename=constant"a_b".html
。报价仍在那里!
答案 1 :(得分:0)
Python不会将双引号转换为文件名中的连字符:
>>> with open('constant_"%s_%s".pdf' % ('foo', 'bar'), 'w'): pass
$ ls ... constant_"foo_bar".pdf ...
可能是django不允许你使用太奇怪的名字。
无论如何,我建议在文件名中仅使用 以下字符,以避免可移植性问题:
注意:我已经排除了列表中的空格,因为有很多脚本没有使用正确的引用,并且打破了这些文件名。
如果你限制自己使用这组字符,你可能不会遇到任何路径名问题。显然,其他人或其他程序可能仍然不遵循此“指南”,因此您不应假设此约定由您从用户或其他外部来源获得的路径共享。
答案 2 :(得分:-1)
您的使用略有不正确。您可能需要围绕整个文件名的引号,以便考虑空格等。
变化:
response['Content-Disposition'] = 'inline; filename=constant_"%s_%s".pdf'\
% ('foo','bar')
为:
response['Content-Disposition'] = 'inline; filename="constant_%s_%s.pdf"'\
% ('foo','bar')