You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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')

为什么原来的代码会报错?

  1. os.mkdir的误用:你传入的是文件路径而非文件夹路径,系统试图创建一个名为test.cpp的文件夹,但它的父目录Delivereds\Question1不存在,因此报路径找不到的错误。
  2. 相对路径的隐患:..\这类相对路径依赖于当前运行的工作目录,Django启动时的工作目录可能和你预期的位置不符,导致路径解析错误;用BASE_DIR构建绝对路径就能完全避免这个问题。
  3. 多级目录创建限制: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 06:59:36