将Web服务器中的文本文件传输给客户端

1 投票
2 回答
1490 浏览
提问于 2025-04-16 08:56

我尝试用下面的脚本把一个位于网络服务器上的文本文件传输到客户端(这个文本文件是UTF-16编码的)。

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

但是,当我打开下载的文件时,里面全是一些奇怪的字符。我试过用 rb 这个标志,但也没有用。

我是不是漏掉了什么?我希望的是,客户端通过请求上面的脚本下载的文件(TEST.TXT),能和服务器上的文件完全一样。

我还尝试明确指定编码。

import cgi

print "Content-Type: text/plain; charset=UTF-16"
print "Content-Disposition: attachment; filename=TEST.txt"
print

filename = "C:\\TEST.TXT"
f = open(filename, 'r')
for line in f:
    print line.encode('utf-16')

但这也不行。


服务器上的原始文件 alt text


下载的文件 alt text


我会把这个 原始文本文件 放在这里,以防你有兴趣去试试。

2 个回答

2

首先,你需要在你的 Content-Type 头信息中指定文件的 编码方式

print "Content-Type: text/plain; charset=UTF-16"
print "Content-Disposition: attachment; filename=TEST.txt"
print

接下来,当你把内容发送给客户端时,必须把这些行用 UTF-16 编码:

print "\xff\xfe",  # send UTF-16 big-endian BOM
for line in f:
    print line.encode("utf-16be")
1

只需忽略文本编码,直接将字节逐个传输给客户端,完全不做任何修改。

#!c:/Python27/python.exe -u

import sys

print "Content-Type: text/plain;"
print "Content-Disposition: attachment; filename=TEST.txt"
print

filename = "C:\\TEST.TXT"
f = open(filename, 'rb')
while True:
    data = f.read(4096)
    sys.stdout.write(data)
    if not data:
        break

撰写回答