Django边学边记——图片上传

1.在python中进行图片操作,需要先安装包PIL

pip install Pillow

  

2.在settings.py配置图片路径

MEDIA_ROOT=os.path.join(BASE_DIR,"static/media") #注意 这里是直接拼接的字符串不是列表,如果写成列表会报一个‘expected str, bytes or os.PathLike object, not list’的错误,这里可以不创建static和media文件夹,只要有图片上传djang会自动创建

  

3.创建包含图片的模型类

  • 将模型类的属性定义成models.ImageField类型
class PicTest(models.Model):
    pic = models.ImageField(upload_to='test/') #这里的pic实际上是一个test/后面再加上图片名的相对路径。也是就说数据库里只是存一个相对路径。这里的test/是相对于上面定义的MEDIA_ROOT的。ImageField继承自FileField,多了一个会对图片进行校验是否是图片的功能。

  

4.在Django中上传图片包括两种方式:

  • 在管理页面admin中上传图片,直接进入后台管理页面点点点。。。
  • 自定义form表单中上传图片
  • 2种方式上传图片后,都是将图片存储在服务器上,然后将图片的路径存储在数据库表中

5.自定义带有form表单的html页面,上传图片

  • 在模板中定义上传表单,必要要求如下:
    • form的属性enctype="multipart/form-data"
    • form的method为post
    • input的类型为file
<html>
<head>
    <title>自定义上传图片</title>
</head>
<body>
    <form method="post" action="/pic_upload/" enctype="multipart/form-data">
        {%csrf_token%}
        <input type="file" name="pic"/><br>
        <input type="submit" value="上传">
    </form>
</body>
</html>

  

6.创建视图pic_upload,用于接收表单保存图片

  • request对象的FILES属性用于接收请求的文件,包括图片
  • from django.conf import settings
    from django.http import HttpResponse
    ...
    def pic_upload(request):
        pic =request.FILES.get('pic') #默认情况下,如果上传的文件小于2.5兆,Django 将把文件的所有内容保存到内存里。大于2.5的放在临时文件里。
        fname ='%s/test/%s'%(settings.MEDIA_ROOT,pic.name) #这里的pic对象 都有个.name 属性 还有类似的 .size 
        with open(fname,'w') as f:
            for i in pic.chunks():  #这里使用 UploadedFile.chunks() 而不是 read() 是为了确保即使是大文件又不会将我们系统的内存占满。chunks每次返回一块内容
                f.write(i)
        PicTest.objects.create(pic = f'/test/{pic.name}' #存进数据库
    
        return HttpResponse('OK')
    

      




posted @ 2021-09-25 23:38  微笑_百年  阅读(79)  评论(0编辑  收藏  举报