通常,当我想将网络服务器文本文件传输到客户端时,我是这样做的
import cgi
print "Content-Type: text/plain"
print "Content-Disposition: attachment; filename=TEST.txt"
print
filename = "C:\\TEST.TXT"
f = open(filename, 'r')
for line in f:
print line
非常适用于 ANSI 文件。但是,比如说,我有一个二进制文件 a.exe
(这个文件在 Web 服务器的 secret 路径中,用户不能直接访问该目录路径)。我想用类似的方法转移。我该怎么做?
- 我应该使用什么内容类型?
- 使用打印似乎在客户端收到了损坏的内容。什么是正确的方法?
我使用以下代码。
#!c:/Python27/python.exe -u
import cgi
print "Content-Type: application/octet-stream"
print "Content-Disposition: attachment; filename=jstock.exe"
print
filename = "C:\\jstock.exe"
f = open(filename, 'rb')
for line in f:
print line
但是,当我将下载的文件与原始文件进行比较时,似乎每一行之后都有一个额外的空格(或更多)。
最佳答案
同意上述关于“rb”和 Content-Type header 的发帖人。
另外:
for line in f:
print line
当在二进制文件中遇到 \n
或 \r\n
字节时,这可能是个问题。做这样的事情可能会更好:
import sys
while True:
data = f.read(4096)
sys.stdout.write(data)
if not data:
break
假设这是在 CGI 环境中的 Windows 上运行,您需要使用 -u
参数启动 python 进程,这将确保 stdout 不处于文本模式
关于python - 从 Web 服务器向客户端提供二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4517134/