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('图片上传成功')