Django为何自动转换文件名下划线为空格,导致文件找不到?
问题原因与解决方案
你遇到的“文件找不到”错误,核心原因是获取文件路径的时机错误,而非下划线被替换:
当你在循环中执行file_instance.resumes.path时,file_instance还未调用save()方法。此时resumes对应的文件还处于临时存储状态,这个临时路径会在file_instance.save()后失效——因为Django会把临时文件移动到MEDIA_ROOT下的最终存储位置,原临时文件会被清理。
至于你看到的下划线变成空格,这是临时文件的命名机制导致的(系统或Django临时文件生成时的处理),并不是最终保存的文件名的问题,本质还是临时路径失效引发的错误。
修复代码
修改views.py中的循环逻辑,先保存模型实例,再获取有效路径:
def home(request): if request.method == 'POST': form = ResumeUpload(request.POST, request.FILES) files = request.FILES.getlist('resumes') if form.is_valid(): f_list = [] if files: for i in files: # 创建实例并关联用户 file_instance = UploadPdf(resumes=i, user=request.user) # 先保存实例,确保文件被移动到最终位置 file_instance.save() # 保存后再获取有效路径 f_list.append(file_instance.resumes.path) for j in f_list: convert_file(j) else: form = ResumeUpload() return render(request, 'app1/home.html', {'form': form})
额外优化建议
- 移除原代码中无用的
f = form.save()逻辑,避免创建空的UploadPdf实例; - 在
convert_file中添加异常处理,避免单个文件转换失败阻塞整个流程:def convert_file(f_path): try: doc = fitz.open(f_path) name = os.path.splitext(os.path.basename(f_path))[0] for page in doc: pix = page.get_pixmap() pix.save(f"{name}-{page.number}.png") print('success!') except Exception as e: print(f"转换失败: {str(e)}") - 确保
settings.py中正确配置MEDIA_ROOT和MEDIA_URL:MEDIA_ROOT = BASE_DIR / 'media' MEDIA_URL = '/media/'
内容的提问来源于stack exchange,提问作者lowkey
相关产品推荐
相关产品推荐

