使用 Python over Apache 通过 HTTP 向用户推送文件时文件名错误

Posted

技术标签:

【中文标题】使用 Python over Apache 通过 HTTP 向用户推送文件时文件名错误【英文标题】:Wrong filename when pushing a file to a user through HTTP using Python over Apache 【发布时间】:2012-06-10 22:31:45 【问题描述】:

我正在向我们的网站添加功能,以便用户可以下载存储在数据库中的文件。问题是我无法为用户正确指定文件名 - 而是提示用户使用运行网站的主要 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 行。感谢大家的快速帮助!

【问题讨论】:

您的代码看起来没有任何问题。您是否尝试过使用 fiddler 或 firebug 捕获响应以确保标头将其纳入响应? 您使用的是什么浏览器? IE 因对不提示输入文件名的特殊标准非常挑剔而臭名昭著。 感谢您的意见;我已经用更多信息编辑了这个问题。 Mike 在下面为我解决了问题,但我一定会在我的 Windows 安装中试用 Fiddler 很高兴它已排序! Fiddler 非常值得投入一些学习时间,它对于这类问题非常宝贵。每次我发现自己在想“我希望它做到了 x”时,我总是发现它已经做到了。断点、故意减慢流量、重新运行http调用和通过它代理服务器端http调用是我的亮点。 【参考方案1】:

在 python 版本

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()

【讨论】:

谢谢!那工作得很好。我现在要阅读有关换行符对标题的重要性的规范。

以上是关于使用 Python over Apache 通过 HTTP 向用户推送文件时文件名错误的主要内容,如果未能解决你的问题,请参考以下文章

Apache Ignite Linq over Sql 无法解析 java 类

如何通过 http 设置 git?

SVN over HTTPS:如何隐藏或加密URL?

python Paramiko SFTP通过RSA密钥传输文件http://code.activestate.com/recipes/576810-copy-files-over-ssh-using-

Apache Flink®极简教程: 架构及原理 Stateful Computations over Data Streams

Flink 极简教程: 架构及原理 Apache Flink® — Stateful Computations over Data Streams