【问题标题】:Zip files get corrupt when uploaded to the server using Tornado使用 Tornado 将 Zip 文件上传到服务器时会损坏
【发布时间】:2013-01-30 13:56:14
【问题描述】:

我正在使用下面的代码将 zip 文件上传到服务器。一切正常,但传入的 zip 文件由于某种原因已损坏。我知道 zip 文件已正确创建,因此它们在创建时不会损坏。因此,服务器代码有问题。

简而言之,像.txt 这样的常规文件可以正常上传,但传入的 zip 文件已损坏。任何人都知道为什么会发生这种情况?

import tornado
import tornado.ioloop
import tornado.web
import os, uuid

__UPLOADS__ = "uploads/"

class Userform(tornado.web.RequestHandler):
    def get(self):
        self.render("form.html")


class Upload(tornado.web.RequestHandler):
    def post(self):
        fileinfo = self.request.files['filearg'][0]
        fname = fileinfo['filename']
        fh = open(__UPLOADS__ + fname, 'w')
        fh.write(fileinfo['body'])
        self.finish("Success!")


application = tornado.web.Application([
    (r"/", Userform),
    (r"/upload", Upload),
    ], debug=True)


if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

【问题讨论】:

  • 您是否尝试过以二进制模式(即“wb”)打开上传的文件目的地?请注意...如果可行,您可能必须处理内容标头以不同方式处理文本和二进制文件(如果您想执行 CR/NL 处理)。

标签: python upload zip tornado


【解决方案1】:

如果服务器运行在 Windows 机器上,那是因为这行代码:

fh = open(__UPLOADS__ + fname, 'w')

将文件作为文本文件打开。当您使用它来创建包含二进制数据的文件时,每次出现的值 0x0a(换行符)都将替换为 \n\r 对。将该行更改为

fh = open(__UPLOADS__ + fname, 'wb')

...将其作为二进制文件打开并查看会发生什么。

【讨论】:

  • 非常感谢,这确实是问题所在!