用户图片上传和保存功能的完整实现(十六)

2020-04-15  本文已影响0人  梦捷者

一、功能实现步骤如下所示:

1、编写相关出处理get/post方法的图片上传类(在main.py模块中进行)

class UploadHandler(BaseHandler):
    """
    用户上传图片信息
    """
    @tornado.web.authenticated
    def get(self):
        self.render('user/upload.html', username=self.current_user)

    @tornado.web.authenticated
    def post(self):
        try:
            files = self.request.files['picture']#list类型中包含一个字典
            if files[0]:
                dict_img = files[0]
                filename = dict_img['filename']
                print(filename)
                print(dict_img['content_type'])
                save_path = 'static/upload/{}'.format(filename)
                with open(save_path, 'wb') as f:
                    f.write(dict_img['body'])
                im = Image.open(save_path)
                im.thumbnail((200, 200))
                im.save('static/thumbs/thumb_{}'.format(filename), 'JPEG')
                post_id = add_post(self.current_user, 'upload/{}'.format(filename), 'thumbs/thumb_{}'.format(filename))
                print(post_id)
                if post_id:
                    self.redirect('/post/{}'.format(str(post_id)))
            else:
                self.write("上传失败,系统不听话")
        except Exception as e:
            print(e)
            self.redirect('/upload')

2、增加add_post方法来进行图片信息的添加操作

def add_post(username, image_url, thumb_url):
    session = Session()
    user = session.query(User).filter_by(username=username).first()
    post = Post(user_id=user.id, image_url=image_url, thumb_url=thumb_url)
    session.add(post)
    session.commit()
    post_id = post.user_id
    session.close()
    return post_id

3、再进行添加路由

handlers=[(r'/upload',main.UploadHandler)]

4、编写前端代码

<!DOCTYPE html>
<html lang="zh-CN" >
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="">
    <meta name="author" content="">
    <link rel="icon" href="../../static/upload/hu.ico">
    <title>上传图片界面</title>
    <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
    <link href="../../static/css/signin.css" rel="stylesheet">
  </head>
  <body background="../../static/upload/2.jpg">
  <nav class="navbar navbar-inverse navbar-fixed-top">
      <div class="container-fluid">
        <div class="navbar-header">
               {% if username!= None %}
          <a class="navbar-brand" href="#">当前在线用户:<font style="color: yellow;font-size:20px">{{ username }}</font></a>
             {% end %}
        </div>
        <div id="navbar" class="navbar-collapse collapse">
          <ul class="nav navbar-nav navbar-right">
               <li style="margin-right:40px "><a href="/logout"><font style="color: yellow;font-size:20px">退出</font></a></li>

          </ul>
        </div>
      </div>
    </nav>


    <div class="container"  style="margin-top: 80px">

      <form class="form-signin" action="/upload" enctype="multipart/form-data" method="post">
        <h2 class="form-signin-heading" style="margin-left: 37px;color: yellow">请上传相应的文件</h2>
           <label for="inputfile" class="sr-only">用户名</label>
        <input type="file" id="inputfile" class="form-control"  required autofocus name="picture">
        <button class="btn btn-lg btn-primary btn-block" type="submit">上传</button>
      </form>
<div  style="margin-left: 547px">
           <font size="3"> <b>查看上传图片,<a href="/check">直接点我</a></b></font>
        </div>
    </div>
  </body>
</html>
上一篇下一篇

猜你喜欢

热点阅读