3

我正在向我们的网站添加功能,以便用户可以下载存储在数据库中的文件。问题是我无法为用户正确指定文件名 - 而是提示用户使用运行网站的主要 python 脚本的名称保存文件。我正在设置 Content-Disposition 信息,但它没有按预期工作。我已将代码编辑为以下内容,但仍然无法正常工作:

import sys, os
import mydatabasemodule
PDFReport = [...read file from database ...]
print('Content-Type: application/octet-stream\n')
print('Content-Disposition: attachment; filename=\"mytest.pdf\"\n')
print(report)
sys.stdout.close()

运行此代码会提示用户将文件下载为 mysite.py。PDF 正确下载只是使用错误的文件名。

谁能告诉我在这里做错了什么?在完整版的代码中,我还设置了 Content-Description 和 Content-Length 但这也失败了。这些文件很小,我试图避免将它们保存到磁盘,但即使我这样做,也会发生同样的问题。

[编辑] 网络服务器运行 CentOS 5.5、Python 2.4.3、Apache 2.2.3 和 mod_python。我已经使用 Google Chrome 17.0.963.46 beta 和 Firefox 13 在 Ubuntu 11.04 客户端上对此进行了测试。如果我尝试显示 PDF 内联:

print('Content-type: application/pdf\n')
print('Content-Disposition: inline; filename=\"mytest.pdf\"\n')
print("Content-Length: %d" % len(report))

然后 Chrome 显示 PDF(带有插件)并且 Firefox 要求保存文件,将其识别为 PDF 但仍然具有错误的文件名,即文件名仍然是脚本名称。

[编辑] Mike 在下面给出了解决方案。我认为问题在于我在上面第一行中添加的换行符。由于 print 添加了换行符,因此第二个换行符表示标题的结束,因此从未读取过 Content-Disposition 行。感谢大家的快速帮助!

4

1 回答 1

3

在 python 版本 < 3.0 中, print 不是一个函数,它会自动添加一个换行符。试试这个。

import sys, os
import mydatabasemodule
PDFReport = [...read file from database ...]
print 'Content-Type: application/octet-stream'
print 'Content-Disposition: attachment; filename="mytest.pdf"'
print
sys.stdout.write(PDFReport)
sys.stdout.flush()
于 2012-06-06T21:12:16.370 回答