项目 02 图片上传和展示

项目 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')#保存在指定的绝对路径下
原文地址:https://www.cnblogs.com/xuchengcheng1215/p/9135894.html