【问题标题】:Transfer Text File in Web Server to Client将 Web 服务器中的文本文件传输到客户端
【发布时间】:2010-12-23 06:52:07
【问题描述】:

我尝试使用以下脚本将位于 Web 服务器中的文本文件传输到客户端(文本文件为 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')

这也不行。


服务器上的原始文件


下载的文件


如果您有兴趣尝试一下,我会将original text file 发布在这里。

【问题讨论】:

  • 我认为问题在于您的文本文件不以 UTF-16 BOM 开头。即使使用codecs.open(),我也找不到任何方法让python正确解码。也许您可以将正确的 BOM 添加到文件中?
  • 但是说我的文本文件没有被正确编码是不正确的,因为记事本、Notepad++、Firefox 能够正确打开我的文本文件。仅供参考,文本文件是使用 C++ 的 wostringstream 生成的
  • 我不是说你的文件没有正确编码,而是我无法让 python 正确解码它:) 因为你使用 python 来读取和传输文件,所以它有为了能够对其进行解码,这就是我建议您在文件中添加 BOM 的原因。
  • 文本文件是由第三方 C++ 库编写的,目前我无法控制 :)
  • @Frédéric Hamidi,或者我可以将其视为二进制文件吗?但是,“打印”是否适用于二进制内容?

标签: python


【解决方案1】:

首先,您应该在Content-Type 标头中指定文件encoding

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

【讨论】:

  • 那也行不通。我仍然得到一个奇怪的文件。不是标题中的字符集,只是告诉浏览器它应该如何呈现文本?我想要的是,我下载的文件与服务器中找到的文件 100% 相同。
  • @Yan Cheng,是的,您在传输文件时还必须对文件行进行编码。请参阅我的更新答案。
  • @Yan Cheng,看来encode() 正在为每一行添加一个BOM,这不是我们想要的。答案已更新,但我假设为大端 UTF-16,您是否可能使用小端?
  • 不。不工作。我已将 TEST.TXT 发布到网络上,您可以更轻松地测试您的解决方案。
  • 当然,在从服务器发送字节时对它们进行编码,一旦在客户端接收到,就使用相同的编码将它们解码以获取内容。
【解决方案2】:

忽略文本编码,将字节到字节传输给客户端,修改为0。

#!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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-27
    • 2019-07-12
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多