Django文件上传后创建文件夹与文件失败问题求助
Django文件上传后创建文件夹与文件失败问题求助
你好呀!看了你的问题,我马上就发现了几个关键点——你现在的问题核心是把文件路径当成文件夹路径传给os.mkdir了,再加上相对路径的歧义,才导致了这些报错。咱们一步步来解决:
核心错误分析
你当前代码里,path = os.path.join(parent_dir, file.name)得到的是包含文件名的完整路径(比如..\Delivereds\Question1\test.cpp),但os.mkdir()是用来创建文件夹的,你让它创建一个叫test.cpp的文件夹,这显然不符合逻辑;而且父文件夹..\Delivereds\Question1可能根本还没创建,系统找不到对应路径,自然直接报错。
修复后的代码示例
首先,咱们用Django自带的BASE_DIR来构建绝对路径,彻底避免相对路径的坑(因为Django启动时的工作目录可能和你预期的不一样)。然后先创建父文件夹,再写入文件:
# 确保已导入必要模块 from django.conf import settings import os elif request.method == 'POST': if request.FILES.get('file'): file = request.FILES['file'] # 用BASE_DIR构建绝对路径,彻底规避相对路径歧义 parent_dir = os.path.join(settings.BASE_DIR, 'Delivereds', 'Question1') # 递归创建多级文件夹,exist_ok=True表示已存在时不报错 os.makedirs(parent_dir, exist_ok=True) # 拼接文件的完整存储路径 file_path = os.path.join(parent_dir, file.name) try: with open(file_path, 'wb+') as destiny: for chunk in file.chunks(): destiny.write(chunk) print(chunk) print("文件保存成功!") except Exception as error: print(f"写入文件出错:{error}")
更规范的维护方案(推荐)
为了后续项目维护方便,建议你在settings.py里专门配置交付文件的根目录:
# settings.py中添加 DELIVERED_ROOT = os.path.join(BASE_DIR, 'Delivereds')
之后在视图里直接调用这个配置即可:
parent_dir = os.path.join(settings.DELIVERED_ROOT, 'Question1')
为什么原来的代码会报错?
os.mkdir的误用:你传入的是文件路径而非文件夹路径,系统试图创建一个名为test.cpp的文件夹,但它的父目录Delivereds\Question1不存在,因此报路径找不到的错误。- 相对路径的隐患:
..\这类相对路径依赖于当前运行的工作目录,Django启动时的工作目录可能和你预期的位置不符,导致路径解析错误;用BASE_DIR构建绝对路径就能完全避免这个问题。 - 多级目录创建限制:
os.mkdir()只能创建单级目录,如果父目录不存在就会报错,而os.makedirs()可以递归创建多级目录,加上exist_ok=True还能避免重复创建的报错。
额外优化建议
- 如果你后续要按用户ID、提交ID分文件夹,只需要在
parent_dir里继续拼接参数即可,比如:os.path.join(settings.DELIVERED_ROOT, str(user_id), str(submission_id)),再用os.makedirs()递归创建。 - 可以给上传的文件重命名,避免同名文件覆盖的问题,比如加上提交ID或时间戳:
f"{submission_id}_{file.name}"。
备注:内容来源于stack exchange,提问作者Leandro Libério
相关产品推荐
相关产品推荐

