Django之上传图片

Django上传
2023-09-20 16:22:15

Django之上传图片

这是一个例子,很多时候,由于前台传过来的内容可能存在差异。但是整个处理逻辑是相同的。

复制代码
class Upload(View):
    def post(self, req):
        LOG.info('start upload %s' % req.FILES)

        resp = {
            "code": 0,
            "msg": "",
            "data": {
                "src": "",
                "title": ""
            }
        }

        img_path = req.POST.get('imgpath', None)
        if img_path is not None:
            img_file = img_path.rsplit('/', 1)[1]
            img_file_path = os.path.join(settings.MEDIA_ROOT, img_file);
            os.remove(img_file_path)
            resp['data']['src'] = img_path
            resp['data']['title'] = '删除图片成功'
            return HttpResponse(json.dumps(resp), content_type="application/json")

        imgs = req.FILES.getlist('file')

        for img in imgs:
            img_id = str(uuid.uuid4())
            img_format = '.' + img.name.rsplit('.', 1)[1]
            path = os.path.join(settings.MEDIA_ROOT, img_id + img_format)
            with open(path, 'wb') as pic:
                for p in img.chunks():
                    pic.write(p)
            resp['data']['src'] = settings.MEDIA_URL + img_id + img_format
            resp['data']['title'] = img_id + img.name

        return HttpResponse(json.dumps(resp), content_type="application/json")

###上传图片大体思路如下

  • 图片源文件,也就是请求里面发送过来的图片
    这个文件可以从req当中获取到req.FILES.getlist或者req.FILES.getlist
  • 图片格式,可以从请求的路径当中获取img_path.rsplit('/', 1)[1]
  • 图片名称,一般要重命名,可以使用uuid或者时间戳作为图片的新名称
  • 上传的目标地址settings.MEDIA_ROOT
  • 上传文件的大小需要考虑,所有在读取图片的时候,不能直接用read读取,而是chunks()