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\')