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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 14:45:40