django 之 图片上传

本文详细介绍了在Django框架中如何实现图片上传的功能,包括设置静态文件和媒体文件路径,使用模型字段处理图片,以及在模板中展示上传的图片。通过实例代码,帮助开发者掌握Django图片上传的完整流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

def upload_file(up_file, domain, ext_types=('png', 'jpeg', 'gif', 'bmp', 'jpg')):
    if up_file:
        date_path = date.strftime(date.today(), "%Y/%m/%d")
        uid = uuid.UUID.time_low.fget(uuid.uuid4())     # 生成一段随机的数字
        folder = domain+"/"+str(date_path)
        ext = up_file.name.split(".")[-1]  # 暂时未考虑 tar.gz 这样的后缀

        if ext in ext_types:
            file_uid = str(uid)
            path_root = settings.MEDIA_ROOT
            path_folder = path_root + folder
            if not os.path.exists(path_folder):
                os.makedirs(path_folder)
            # 保存文件到服务器的完整路径
            file_upload = path_folder + "/" + file_uid + "." + ext
            # 保存在DB中的文件信息:文件路径,文件尺寸(若有),文件大小
            file_info = folder + "/" + file_uid + "." + ext
            try:
                if ext in ('png', 'jpeg', 'gif', 'bmp', 'jpg'):
                    parser = ImageFile.Parser()
                    for chunk in up_file.chunks():
                        parser.feed(chunk)
                    img = parser.close()
                    # 原先的上传图片存在透明图片上传之后透明部分变黑的问题,已做修改
                    # img.convert('RGB').save(file_upload, format="JPEG", quality=85)
                    img.convert('RGBA').save(file_upload, format="PNG", quality=85)
                else:
                    with open(file_upload, 'wb') as fd:
                        for chunk in up_file.chunks():
                            fd.write(chunk)
            except Exception as e:
                LOG.error(u"上传失败!%s", e)
                return UPLOAD_FAIL, "上传失败!"
            # 获取文件大小
            if ext in ('png', 'jpeg', 'gif', 'bmp', 'jpg'):
                image = Image.open(file_upload)
                src_w, src_h = image.size
                file_info += ","+str(src_w)+"_"+str(src_h)
            else:
                file_info += ",0_0"
            file_size = os.path.getsize(file_upload)
            file_info += ","+str(file_size)
            return UPLOAD_SUCCESS, file_info
        else:
            return NOT_SUPPORT, """不是支持的文件类型!"""
    else:
        return NO_FILE, """未上传文件"""

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值