Django:文件上传三要素,图片上传、存储与显示
图片属于位图文件,也是一种文件
一:文件上传 文件上传三要素: 1.提交方式 :必须是post 。 2.编码方式:enctype 必须是 multipart/form-data。 3.标签类型:必须是 file 类型。
二:例子: (1)html页面部分 如:
其中<img src=’’{%static image%}’’ alt=’’ ‘’> 用于显示图片 (2)图片上传、存储与显示的视图模块
#上传文件:
def lishan02(request):
img_name =
if request.method == POST:
img_obj = request.FILES[picture] # 获取上传文件对象
img_name = request.FILES[picture].name # 获取上传文件的字符串类型名称
path = static/ + img_name
with open(path, mode=wb) as f:
for content in img_obj.chunks(): # 读取上传文件的内容
f.write(content) # 存储图像文件
return render(request, app01/lishan02.html, {image: img_name})
其中要注意的是: 1:获取文件对象是用 获取只有一张图或一个文件:img_obj = request.FILES[‘picture’] 获取上传多张图片:userfiles = request.FILES.getlist(‘userfiles’) 2:区分图片对象与正确的字符串类型图片名称;因为图片在django中属于对象,图片对象取出来需要加 .name(由于django内模块编写原因),区别于一般表模型 3:path = ‘static/’ + img_name 和 with open(path, mode=‘wb’) as f: 表示存储在static文件下 4:读取上传图片的内容 for content in img_obj.chunks(): 用图片对象.chunks 5:因为html页面已经导入 static ({%static image%}),故显示图片文件时,路径要去掉static,故此例传输数据使用image而不用path 6:模型中使用:ImageField() , ImageField会将路径封装成一个对象,
三:进阶:电商后台多图上传设计路径名称 保存 代码(部分)
#注意上传字段使用 FILES.getlist() 来获取 多张图片
userfiles = request.FILES.getlist(userfiles) # 商品缩略图 FILES
#循环遍历读取每张图保存在images下 --->枚举 :enumerate
for index, image_obj in enumerate(userfiles):
# 1:保存图片
# 苹果_0_(可加时间戳).jpg,苹果_1_(可加时间戳).jpg,...
# 1.2.3.4jpg --> jpg
name = image_obj.name.rsplit(., 1)[1]
path = static/seller/images/{}_{}.{}.format(goods_name, index, name)
with open(path, mode=wb) as f:
for content in image_obj.chunks():
f.write(content)
利用enumerate 枚举来创造序号(相当于下标)
