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

FastAPI服务器文件上传异常:“文件路径不是有效文件或URL”

问题分析与解决方案

核心问题

  1. 函数参数名错误:extract_text_from_pdf函数定义的参数是file,但内部却使用了未定义的变量path,这会直接导致路径无效。
  2. 错误使用上传文件名作为路径:FastAPI上传的UploadFile对象的filename只是客户端上传的文件名,服务器并不会自动将文件保存到应用目录下。本地环境偶尔正常是因为你的本地目录刚好存在同名文件,而服务器上只有巧合存在该文件名时才会成功,这就是问题间歇性出现的原因。
  3. 变量名不匹配:API函数参数是r和j,但代码里却用了resume和job_description这类未定义变量,同样会引发错误。

修正后的代码示例

修正extract_text_from_pdf函数

def extract_text_from_pdf(file_path):
    pdf_loader = PDFMinerLoader(file_path)
    data = pdf_loader.load()
    text = data[0].page_content  # 取第一页内容
    return text

修正API端点函数(处理上传文件并保存到临时路径)

import tempfile
import os
from fastapi import UploadFile, File, HTTPException

@app.post("/analyze_text")
async def analyze_text(r: UploadFile = File(...), j: UploadFile = File(...)):
    tmp_resume_path = None
    tmp_job_path = None
    try:
        # 将上传的简历文件保存到临时文件
        with tempfile.NamedTemporaryFile(delete=False, suffix=".pdf") as tmp_resume:
            tmp_resume.write(await r.read())
            tmp_resume_path = tmp_resume.name
        
        # 将上传的职位描述文件保存到临时文件
        with tempfile.NamedTemporaryFile(delete=False, suffix=".pdf") as tmp_job:
            tmp_job.write(await j.read())
            tmp_job_path = tmp_job.name
        
        # 提取PDF文本
        r_text = extract_text_from_pdf(tmp_resume_path)
        j_text = extract_text_from_pdf(tmp_job_path)

        # 原业务逻辑(prompt、对话解析部分)
        prompt = ChatPromptTemplate.from_template(template=r_template)
        messages = prompt.format_messages(r_text=r_text, format_instructions=format_instructions)
        r_response = chat(messages)
        output_dict = output_parser.parse(r_response.content)

        return output_dict
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))
    finally:
        # 无论成功失败,清理临时文件
        if tmp_resume_path and os.path.exists(tmp_resume_path):
            os.unlink(tmp_resume_path)
        if tmp_job_path and os.path.exists(tmp_job_path):
            os.unlink(tmp_job_path)

额外说明

  • 用tempfile.NamedTemporaryFile创建临时文件,既能满足PDFLoader对文件路径的要求,又能避免服务器积累无用文件,处理完成后自动清理。
  • 原代码中未处理的变量名错误已经同步修正,确保参数和使用的变量一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 06:32:43