Python项目----模仿Instagram的应用(2..图片上传及缩略图)

第一天我们学习了如何简单的使用tornado框架能够在浏览器展示我们的代码成功,我们只是才开始呦。今天,就来看一下如何上传图片?

1.既然要上传图片,首先我们要在static文件夹中创建一个upload文件夹,放我们上传上去的图片

2.在templates文件夹中创建一个upload.html文件并写入代码

{% extends 'base.html' %}
{% block title %}上传{% end %}

{% block  content %}

<div>
    <form action="/upload" enctype="multipart/form-data" method="post">
        <input type="file" name="newimg">
        <input type="submit">
    </form>
</div>
{% end %}

3.在main.py里加一个UploadHandler了,相应的,也必须在主程序app.py中设置一个对应的路由,如图:

 4.UploadHandler的详细内容:

class UploadHandler(tornado.web.RequestHandler):
    """
    上传图片
    """
    def get(self,*args,**kwargs):
        self.render('upload.html')

    def post(self, *args, **kwargs):
        img_files = self.request.files.get('newimg',None)
        for img in img_files:
            #{"filename":..., "content_type":..., "body":...}
            print('got {}'.format(img['filename']))
            with open('static/upload/{}'.format(img['filename']),'wb') as f:
                f.write(img['body'])
                print(f)
            self.write('upload done ')

 可以看到我们运用了self.request.files这个方法, 通过一个表单上传的话就可以使用这个方法,每个上传的文件都是字典格式

{"filename":..., "content_type":..., "body":...}filename:文件名;content_type内容类型;body:上传文件的内容,文件内容是字节形式。

写入成功之后,就说明我们的文件被保存在相应的路径下面了!

OK,现在就可以 正常的上传啦~

运行app.py并且在浏览器中输入对应的网址(192.168.26.128:8080/upload)来看看效果:

相对应的文件夹下也会出现上传的图片:

5.展示上传图片:

现在文件已经上传了,但是显然无法在页面上展示出来,这次我们先在explore.html文件中做点修改

一张图片的话我们可以这样做:

访问explore页面效果:

我要查看全部的图片呢?即把upload目录下面所有的图片取出来。

我们可以使用Python中的glob模块:它是用来文件路径查找的(详细使用可以点击链接查看。)

在使用之前记得import哦~

main.py中加入如下代码并对ExploreHandler做稍微的修改:

稍微修改一下explore.html文件

 在查找到upload文件夹下面所有的文件(图片)名称信息之后,ExploreHandler中调用get_images方法,获取到所有的文件,再将urls传入到explore.html文件中,通过for循环拿到每一个图片,这样就可以把所有的上传的图片展示出来了

6.生成缩略图

(1)创建thumbs文件夹  /static/upload/thumbs

(2)安装pillow包 :pip install pillow

(3)为了代码看上去整齐一点,我们为服务图片的代码专门建个文件夹utils,再新建一个photo.py

把之前在main.py中的某些代码就可以放到photo.py中了

ExploreHandler稍做修改

photo.py

#-*- coding:utf-8-*-
import glob,os
from PIL import Image

def get_images(path):
    os.chdir('static')
    fs = glob.glob(path + '/*.jpg')
    os.chdir('..')
    return  fs

def make_thumb(path):
    im = Image.open(path)
    im.thumbnail((200,200))
    name = os.path.basename(path)#根据传入的路径拿到文件名
    filename,ext = os.path.splitext(name)#分离文件名,eg:1.jpg---->['1','.jpg']
    #以某种格式保存图片 eg:filename_200x200.jpg
    im.save('static/upload/thumbs/{}_{}x{}{}'.format(
        filename,200,200,ext
    ),'JPEG')

代码已经注释很详细了呦,对pillow这块有兴趣的可以查看pillow官方文档

接下来在更新我们main.py中的UploadHandler

OK,这下我们可以上传图片并且在发现页可以成为缩略图啦!!!!


我的天,02:32了,我真的是疯了,啊啊啊啊啊啊啊啊,皮肤变差,身体变差,可是谁让我只有大晚上才能专注呢!!坚持坚持~~~~~~有时间多赚钱,少抱怨少矫情

 

 

 

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值