欢迎访问宙启技术站
智能推送

使用Tornado框架实现文件上传和下载功能

发布时间:2023-12-28 15:57:15

Tornado是一个Python的Web框架,它提供了高效和易用的非阻塞式网络通信能力。在Tornado中实现文件上传和下载功能需要用到RequestHandler和tornado.web模块。

文件上传功能是允许用户将本地文件上传到服务器端。以下是使用Tornado实现文件上传功能的代码示例:

import tornado.ioloop
import tornado.web

class UploadHandler(tornado.web.RequestHandler):
    def post(self):
        file = self.request.files['file'][0]
        file_name = file['filename']
        file_body = file['body']
        
        with open(file_name, 'wb') as f:
            f.write(file_body)
        
        self.write('File uploaded successfully!')

def make_app():
    return tornado.web.Application([
        (r'/upload', UploadHandler),
    ])

if __name__ == '__main__':
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

在上述代码中,我们定义了一个UploadHandler类,继承自tornado.web.RequestHandler。在post方法中,通过self.request.files['file'][0]获取到上传的文件对象,其中'file'是HTML页面中<input type="file" name="file">元素的name属性。然后通过file对象的'filename'和'body'属性获取到文件名和文件内容,分别写入到服务器本地。在文件写入完成后,返回给客户端一个上传成功的信息。

文件下载功能是允许用户从服务器端下载服务器上的文件。以下是使用Tornado实现文件下载功能的代码示例:

import tornado.ioloop
import tornado.web
import os

class DownloadHandler(tornado.web.RequestHandler):
    def get(self, file_name):
        file_path = os.path.join(os.path.dirname(__file__), file_name)
        
        with open(file_path, 'rb') as f:
            self.set_header('Content-Type', 'application/octet-stream')
            self.set_header('Content-Disposition', 'attachment; filename=' + file_name)
            self.write(f.read())

def make_app():
    return tornado.web.Application([
        (r'/download/(.*)', DownloadHandler),
    ])

if __name__ == '__main__':
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

在上述代码中,我们定义了一个DownloadHandler类,继承自tornado.web.RequestHandler。在get方法中,通过self.set_header方法设置response的Content-Type和Content-Disposition头信息,Content-Type设置为'application/octet-stream'表示将要下载的是二进制文件,Content-Disposition中的attachment表示文件为附件,filename表示文件名。然后通过self.write方法将文件内容写入到response中,完成文件的下载。

在上述代码中,通过正则表达式将文件名匹配到file_name参数中,然后通过os.path.join和os.path.dirname方法获取到文件的完整路径。最后通过open方法打开文件并将其内容写入到response中。

在代码的最后部分,我们定义了一个make_app函数来创建Tornado的Application实例,并通过调用app.listen方法来监听端口。最后通过tornado.ioloop.IOLoop.current().start()方法启动Tornado服务器。

通过以上代码示例,我们可以使用Tornado框架实现文件上传和下载功能。通过UploadHandler类和DownloadHandler类的post和get方法,通过self.request.files和self.set_header方法来获取上传文件的信息和设置下载文件的头信息,最后通过self.write方法将文件内容返回给客户端。