Django:文件上传三要素,图片上传、存储与显示

图片属于位图文件,也是一种文件

一:文件上传
文件上传三要素:
1.提交方式 :必须是post 。
2.编码方式:enctype 必须是 multipart/form-data。
3.标签类型:必须是 file 类型。

二:例子:
(1)html页面部分
如:

其中’’ 用于显示图片
Django:文件上传三要素,图片上传、存储与显示_第1张图片
(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会将路径封装成一个对象,

(3)效果图
Django:文件上传三要素,图片上传、存储与显示_第2张图片
上传图片:
Django:文件上传三要素,图片上传、存储与显示_第3张图片
图片存储:
Django:文件上传三要素,图片上传、存储与显示_第4张图片
图片显示:
Django:文件上传三要素,图片上传、存储与显示_第5张图片

三:进阶:电商后台多图上传设计路径名称 保存
代码(部分)

#注意上传字段使用 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 枚举来创造序号(相当于下标)

你可能感兴趣的:(Django)