FastAPI服务器文件上传异常:“文件路径不是有效文件或URL”
问题分析与解决方案
核心问题
- 函数参数名错误:
extract_text_from_pdf函数定义的参数是file,但内部却使用了未定义的变量path,这会直接导致路径无效。 - 错误使用上传文件名作为路径:FastAPI上传的
UploadFile对象的filename只是客户端上传的文件名,服务器并不会自动将文件保存到应用目录下。本地环境偶尔正常是因为你的本地目录刚好存在同名文件,而服务器上只有巧合存在该文件名时才会成功,这就是问题间歇性出现的原因。 - 变量名不匹配: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
相关产品推荐
相关产品推荐

