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

Django文件上传至服务器失败:首次成功后续报错的原因及解决办法

问题分析与修复方案

原代码

if request.method == 'POST': 
    k = request.FILES
    obj = request.FILES['upload']
    t = int(time.time())
    jobid = 'jobid'+str(t)
    job_name = jobid + '_' + obj.name
    print(job_name)
    fr = open('prediction/PanPep/upload/' + job_name, 'wb+')

问题现象

首次上传文件正常,后续尝试创建文件时触发以下错误:

FileNotFoundError: [Errno 2] No such file or directory: 'prediction/PanPep/upload/jobid1709638360_Example_zero-shot.csv'
[05/Mar/2024 19:32:40] "POST /panpep/ HTTP/1.1" 500 67598


错误原因

  1. 相对路径依赖工作目录:使用的'prediction/PanPep/upload/'是相对路径,其有效性完全依赖程序运行时的当前工作目录。若后续程序重启、部署环境切换(如WSGI服务器变更工作目录),就会找不到目标目录。
  2. 未提前确保目录存在:代码直接尝试打开文件,但未检查并创建目标目录。首次上传正常仅说明当时目录存在,后续可能因清理操作、权限变更等导致目录被删除。
  3. 文件操作不完整:原代码仅打开文件但未写入上传内容,且未正确关闭文件句柄,可能引发资源泄漏或文件系统异常。

修复代码

import os
import time

if request.method == 'POST': 
    obj = request.FILES['upload']
    t = int(time.time())
    jobid = f'jobid{t}'
    job_name = f'{jobid}_{obj.name}'
    
    # 构建绝对路径,避免工作目录依赖
    current_script_dir = os.path.dirname(os.path.abspath(__file__))
    upload_dir = os.path.join(current_script_dir, 'prediction', 'PanPep', 'upload')
    
    # 递归创建目录,已存在则不报错
    os.makedirs(upload_dir, exist_ok=True)
    
    # 拼接完整文件路径,用with语句自动管理文件句柄并写入内容
    file_full_path = os.path.join(upload_dir, job_name)
    with open(file_full_path, 'wb+') as fr:
        for chunk in obj.chunks():
            fr.write(chunk)
    
    print(f"文件已成功保存:{file_full_path}")

关键修复点

  • 绝对路径构建:通过os.path.abspath(__file__)获取当前脚本的绝对路径,再拼接上传目录,彻底消除工作目录变化带来的路径问题。
  • 目录预创建:os.makedirs(...)自动创建所有缺失的父目录,exist_ok=True避免重复创建时报错。
  • 规范文件操作:用with语句自动关闭文件句柄,同时通过obj.chunks()分块写入大文件,既保证资源释放,又避免内存占用过高。

内容的提问来源于stack exchange,提问作者Ezra Corli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 17:54:51