使用Tornado上传文件时Zip文件损坏

1 投票
1 回答
1051 浏览
提问于 2025-04-17 14:11

我正在使用下面的代码将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()

1 个回答

4

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

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

把文件当作文本文件来打开。当你用这个方法创建一个包含二进制数据的文件时,所有出现的值0x0a(换行符)都会被替换成\n\r这对字符。你可以把那行代码改成

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

...这样就可以把文件当作二进制文件打开,看看会发生什么。

撰写回答