项目 02 图片上传和展示
main.py
import tornado.web import os from utils import photo #导入utils里面的photo.py class IndexHandler(tornado.web.RequestHandler): """ Home page for user,photo feeds """ def get(self,*arg,**kwargs): images_path = os.path.join(self.settings.get('static_path'),'uploads') images = photo.get_images(images_path) self.render('index.html',images = images) class ExploreHandler(tornado.web.RequestHandler): """ Explore page,photo of other users """ def get(self,*arg,**kwargs): images_urls = photo.get_images('./static/uploads/thumbs')#打开指定路径下的文件 self.render('explore.html',images=images_urls)#打开explore文件并将图片放上去 class PostHandler(tornado.web.RequestHandler): """ Single photo page and maybe """ def get(self,*arg,**kwargs): self.render('post.html',post_id = kwargs['post_id']) class UploadHandler(tornado.web.RequestHandler): """ 接收图片上传 """ def get(self,*arg,**kwargs): self.render('upload.html')#返回这个页面 def post(self, *args, **kwargs): #接收文件 img_files = self.request.files.get('newimg',None)#用RequestHandler的一种属性,接收表单上传的时候会有一个属性可以用get访问,默认为空 for img_file in img_files:#可能同一个上传的文件会有多个文件,所以要用for循环去迭代它 with open('./static/uploads/'+img_file['filename'],'wb') as f:#表单提交上来是一个文件,需要用open来打开 f.write(img_file['body'])#body就是文件的内容即图片 photo.make_thumb('./static/uploads/'+img_file['filename']) #在创建文件的同时建立减缩图 self.write({'msg': 'got file:{}'.format(img_files[0]['filename'])})#浏览器显示返回
templates/uploads.html
{% extends 'base.html' %} {% block title %} index page {% end %} {% block content %} <form action="/upload" enctype="multipart/form-data" method="post"> #依次是接收文件(即提交接口),form表单要提交的标准操作,方法*/ <input type="file" name="newimg"> <input type="submit"> </form> {% end %}
utils 工具类函数包
utils/photo.py
import glob import os from PIL import Image def get_images(path):#函数意义是将某个路径下所有的文件会返回成一个列表 images = [] for file in glob.glob(path+'/*.jpg'):#所有目录下面为*.jpg的所有图片, images.append(file)#添加所有file,每个file都是一个全路径 return images def make_thumb(path): file,ext = os.path.splitext(os.path.basename(path))#分离路径 im = Image.open(path)#打开路径文件 im.thumbnail((200,200))#进行减缩 im.save('./static/uploads/thumbs/{}_{}x{}.jpg'.format(file,200,200),'JPEG')#保存在指定的绝对路径下