Django图片上传

setting.py

STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]

MEDIA_ROOT = os.path.join(BASE_DIR, 'static/media/')

app/models.py

from django.db import models


class PictureModel(models.Model):
    # 该字段用于保存图片上传之后的地址;
    # upload_to: 指明图片在MEDIA_ROOT目录下的具体存放目录。如果不指定这个参数,默认所有的图片都保存在MEDIA_ROOT目录下。/static/media/imguploadapp/1.jpg
    # upload_to如果指定了目录,目录需要自己手动创建。
    pic_url = models.CharField(max_length=50)

    class Meta:
        db_table = 'picture'

app/views.py

from django.shortcuts import render
from .models import PictureModel
from django.conf import settings
from django.http import HttpResponse

"""
图片上传:
1. 将图片上传至static文件夹下;
2. 将图片上传至自定义文件夹下;
"""

# 第一种:上传至static文件夹下;
# 1. 配置static根搜索目录;
# 2. 配置图片上传之后,保存的文件目录;默认情况下,Django是将上传的图片保存在本地目录下;MEDIA_ROOT
# 3. 定义一个Model类,在Model中声明一个用于保存图片地址的字段,放在数据库的表中;
# 4. 在html文件中添加上传图片的表单;


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

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

 

posted @ 2018-11-23 09:51  陈桑啊丶  阅读(255)  评论(0编辑  收藏  举报