Django框架(十五:表单中图片的上传)

图片的上传,就是后台获取表单传过来的图片并保存。需要实现两部分,一部分是将图片的路径保存到数据库,另一部分是把图片文件上传到后台。
下面来执行具体的操作:

  1. 由于上传图片时默认保存在根目录下的,所以需在settings.py文件中配置图片上传的路径
    Django框架(十五:表单中图片的上传)
  2. 定义一个Model类,在Model中声明一个用于保存图片地址的字段,放在数据库的表中;(此处不再展示代码)
  3. 在html文件中添加上传图片的表单。input的type值必须为file
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>图片上传</title>
    </head>
    <body>
        <form action="/upload/" method="post" enctype="multipart/form-data">
            {# application/x-www-form-urlencoded:  username='123'&password='456' 适合文本 #}
            {# multipart/form-data: 以指定的分隔符对上传数据进行分割 适合二进制文件 #}
            {# 上传图片相当于上传数据,一定要使用POST请求,并且要指定一个属性enctype #}
            {% csrf_token %}
            <input type="file" name="picture">
            <button type="submit">上传</button>
        </form>
        <img src="/static/media/{{ img.pic_url }}" alt="">
    </body>
</html>
  1. 路由就自己配置了,接下来在views.py文件中代码实现,具体的作用,已经注释
def uploadimg(request):
    if request.method == 'GET':
        # img = PictureModel.objects.get(id=18)
        # return render(request, 'index.html', {'img': img})

        return render(request, 'index.html')
    else:
        # 需要从表单input中,获取上传的文件对象(图片)
        pic = request.FILES.get('picture')

        # 1. 创建Model对象,保存图片路径到数据库
        model = PictureModel()
        model.pic_url = pic.name
        model.save()

        # 2. 开始处理图片,将图片写入到指定目录。(/static/media/images/)
        # 拼接图片路径
        url = settings.MEDIA_ROOT + 'images/' + pic.name
        with open(url, 'wb') as f:
            # pic.chunks()循环读取图片内容,每次只从本地磁盘读取一部分图片内容,加载到内存中,并将这一部分内容写入到目录下,写完以后,内存清空;下一次再从本地磁盘读取一部分数据放入内存。就是为了节省内存空间。
            for data in pic.chunks():
                f.write(data)

        return HttpResponse('图片上传成功')