使用Tornado框架实现文件上传和下载功能
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方法将文件内容返回给客户端。
