Form Recognizer自定义模型调用报1000无效输入文件错误如何解决?
问题排查与解决方案
核心错误原因
你当前代码的核心问题是请求传输格式冲突:
- 当你使用
requests库的files参数上传文件时,requests会自动将请求头的Content-Type设置为multipart/form-data,同时自动处理文件的二进制封装。 - 你手动指定
Content-Type: application/{file_type}会覆盖该默认值,导致自定义模型接口无法正常识别请求中的文件内容,因此返回Invalid input file报错。 - layout接口的入参校验逻辑兼容性更高,所以可以正常运行。
修复方案
你可以从两种合法的请求方式中选一种即可:
方式1:保留files参数,删除手动设置的Content-Type头
这是更简单的方案,修改后的代码如下:
import requests import os import pathlib # 待评估文件路径 floc = 'path/to/file' # 只保留API Key头,Content-Type交给requests自动处理 headers = { 'Ocp-Apim-Subscription-Key': os.environ["AZURE_FORM_RECOGNIZER_KEY"] } # 二进制读取文件 files = {'file': open(floc, 'rb')} # 发送分析请求 r = requests.post( f'https://eastus.api.cognitive.microsoft.com/formrecognizer/v2.1/custom/models/{os.environ["MODEL_ID"]}/analyze', headers=headers, files=files ) print(r.status_code) print(r.json())
方式2:直接传输二进制文件,手动指定Content-Type
如果不想用multipart/form-data格式,就删除files参数,把二进制内容直接放到data参数里:
import requests import os import pathlib # 待评估文件路径 floc = 'path/to/file' # 提取文件类型 file_type = pathlib.Path(floc).suffix[1:] # 设置请求头 headers = { 'Content-Type': f'application/{file_type}', 'Ocp-Apim-Subscription-Key': os.environ["AZURE_FORM_RECOGNIZER_KEY"] } # 直接读取文件二进制内容 with open(floc, 'rb') as f: file_data = f.read() # 发送分析请求 r = requests.post( f'https://eastus.api.cognitive.microsoft.com/formrecognizer/v2.1/custom/models/{os.environ["MODEL_ID"]}/analyze', headers=headers, data=file_data ) print(r.status_code) print(r.json())
其他可选排查点
如果修改后仍然报错,可以依次检查以下项:
- 确认测试文件本身没有损坏、没有加密、没有设置编辑限制,单页文件大小不超过50MB,像素在50 x 50到10000 x 10000之间
- 确认
MODEL_ID、API密钥、接口区域和你训练模型时的资源配置完全一致 - 确认自定义模型训练时使用的文件格式和你测试的格式匹配,训练时标注的字段没有逻辑错误
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

