5

我正在使用 Django 中的 ReportLab 生成一些 pdf。我遵循并尝试了这个问题的答案,并意识到其中的双引号没有意义:

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 消毒有关吗?

4

3 回答 3

2

这个问题的研究看来,实际上是浏览器在进行编码/转义。我曾经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. 引号还在!

于 2012-08-16T19:32:05.000 回答
0

Python 不会将双引号转换为文件名中的连字符:

>>> with open('constant_"%s_%s".pdf' % ('foo', 'bar'), 'w'): pass
    $ ls
    ...
    常量_“foo_bar”.pdf
    ...

可能是 django 不允许您使用太奇怪的名称。

无论如何,我建议在文件名中使用以下字符,以避免可移植性问题:

  • 字母 [az][AZ]
  • 数字 [0-9]
  • 连字符 (-)、下划线 (_)、加号 (+)

注意:我已经排除了列表中的空格,因为有很多脚本没有使用正确的引用,并且使用这样的文件名中断。

如果您将自己限制在这组字符中,您可能永远不会对路径名有任何问题。显然,其他人或其他程序可能仍然不遵循此“指南”,因此您不应假设此约定由您从用户或其他外部来源获得的路径共享。

于 2012-08-16T19:07:42.727 回答
-1

你的用法有点不正确。您可能需要整个文件名周围的引号以说明空格等。

改变:

response['Content-Disposition'] = 'inline; filename=constant_"%s_%s".pdf'\
% ('foo','bar')

到:

response['Content-Disposition'] = 'inline; filename="constant_%s_%s.pdf"'\
% ('foo','bar')
于 2012-08-16T19:15:07.563 回答