1.后端代码
import os import tornado.ioloop import tornado.web # web应用api from PIL import Image class FormsHandler(tornado.web.RequestHandler): def get(self): path = os.listdir('/home/pyvip/my_tornado/static/files/') # 传入一个路径,返回一个列表,里面是这个目录下面的所有文件名 self.render('upload_file.html', path=path) def post(self): upload_path = '../static/files' # 配置文件上传的路径 file_metas = self.request.files.get('file', []) # 获取文件对象 # [{'filename':'1.jpg', 'body': b'xxx'}, {'filename':'2.jpg', 'body': b'xxx'}] for meta in file_metas: # meta {'filename':'1.jpg', 'body': b'xxx'} file_name = meta.get('filename') file_path = os.path.join(upload_path, file_name) # 拼接路径 with open(file_path, 'wb') as f: f.write(meta.get('body')) # 写入内容 # 获取图片后缀名 image_type = file_name.split('.')[-1] # 缩略图 im = Image.open(file_path) # 打开图片 im.thumbnail((200, 200)) # 设置图片大小 if image_type == 'jpg': aa = 'jpeg' elif image_type == 'png': aa = 'png' im.save(file_path, aa) return self.redirect('/f') def make_app(): return tornado.web.Application([ # tornado配置,静态文件等 (r"/f", FormsHandler), # 配置路由 ], debug=True, static_path='../static', # 配置静态文件路径 template_path='../template', # 配置模板路径 ) if __name__ == "__main__": # 只有在当前文件运行的时候才会执行 app = make_app() app.listen(8888) tornado.ioloop.IOLoop.current().start() # 开启tornado服务
2.前端代码(新建template/upload_file.html文件)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>文件上传</title> <style> li{ list-style: none; float: left; margin-left: 10px; } </style> </head> <body> <form action="" method="post" enctype="multipart/form-data"> <input type="file" name="file"><br> <input type="file" name="file"><br> <button type="submit">上传</button> </form> <br> <div> <ul> {% for i in path %} <li><img src="{{ static_url('files/{}'.format(i)) }}" alt=""></li> {% end %} </ul> </div> </body> </html>
3.创建static/files文件夹,用来保存上传的图片
4.运行效果图