AI智能
改变未来

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 settingsfrom 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 属性 还有类似的 .sizewith 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\')

      




赞(0) 打赏
未经允许不得转载:爱站程序员基地 » Django边学边记——图片上传