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

