版本日期:2026-09-20。适用范围:当前仓库实现。
本文路径、文件名、大小和摘要均为示例,不是线上检测结果。将 https://api.example.com
替换为实际服务地址。后端入库前建议采用本文的 JSON 三字段请求。
| 项目 | 说明 |
|---|---|
| 用途 | 入库前检测文件是否为有效 DOCX 或可提取文字的 PDF |
| 请求方法 | POST |
| 请求路径 | /api/v1/files/validate |
| 请求格式 | application/json;兼容 multipart/form-data 单文件上传 |
| 响应格式 | application/json,直接返回对象,无 code / data 外层包装 |
| 执行方式 | 同步检测,当前请求直接返回结果,不需要轮询 |
| 鉴权 | 当前应用不要求 token;如部署网关设置鉴权,按网关要求提供 |
| 其他参数 | 不需要 txbId、CALLBACK_URL 或生成任务参数 |
本接口只检测文件,不负责入库,不创建投标生成任务,不调用 LLM、不执行 OCR、不发送回调。 源文件保持不变,检测副本在成功或失败后自动清理。
放行规则:仅 HTTP 200 且响应 valid=true 时继续入库。其他状态或网络异常均不能视为通过。
{
"file_path": "static/file/参考投书.docx",
"file_role": "REFERENCE_BID",
"is_absolute": false
}
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
file_path |
string | 是 | 服务端本地文件路径,不能为空;不是 HTTP URL,也不是调用方电脑上仅本机可见的路径 |
file_role |
string | 是 | 业务用途,见下表;枚举值区分大小写 |
is_absolute |
boolean | 是 | true 直接读取清理后的路径;false 根据业务用途拼接配置目录。必须传 JSON 布尔值,不能传字符串 "false" 或数字 0/1 |
file_role |
业务用途 | is_absolute=false 时的目录 |
|---|---|---|
TENDER_FILE |
招标文件 | TPC_DIR |
PROCUREMENT_FILE |
采购需求 | TPC_DIR |
CLA_FILE |
澄清公告 | TPC_DIR |
REFERENCE_BID |
参考投书 | 依次查找 REFERENCE_DIR、REFERENCE_DIR1 |
file_role 是业务用途,file_type 是响应中的实际文件格式(docx / pdf),两者不同。
当前检测接口中,业务用途只决定路径解析规则,各用途均可检测 DOCX 或文字型 PDF。
原生成接口仍要求招标文件为文字 PDF、采购需求和参考投书为 DOCX;检测通过不代表已满足
生成接口对应字段的格式要求。澄清公告在原生成接口中仍仅接收记录、不参与生成。
file_path 首尾空白,删除独立的 static/ 或 static\ 目录段。
mystatic/、文件名 static.docx 不受影响,配置目录本身不清理。is_absolute=true:按清理后的路径直接读取,不拼接业务目录。调用方应提供服务端绝对路径。
为兼容原接口,此模式不会额外拒绝相对文本;若误传相对路径,会按服务进程当前工作目录解析。is_absolute=false:去掉清理后路径开头的 / 或 \,按上表拼接配置目录。
即使传入路径以 / 开头,也不会自动改成绝对路径模式。REFERENCE_DIR;
第一份存在但内容不合法时,直接返回检测失败,不跳到第二份。路径按 API 所在操作系统解释。Windows 路径建议使用 E:/uploads/a.docx,或在 JSON 中
正确转义反斜杠。相对配置目录也按服务进程工作目录解析,生产环境建议配置绝对目录。
示例配置(请替换为实际服务端配置):
TPC_DIR=/data/tender
REFERENCE_DIR=/data/shenqin
REFERENCE_DIR1=/data/dms/dms_upload
| 请求路径 | 用途 | 模式 | 解析结果 |
|---|---|---|---|
static/file/招标文件.pdf |
TENDER_FILE |
false | /data/tender/file/招标文件.pdf |
/static/file/采购需求.docx |
PROCUREMENT_FILE |
false | /data/tender/file/采购需求.docx |
static/file/参考投书.docx |
REFERENCE_BID |
false | 先查 /data/shenqin/file/参考投书.docx,未找到再查 /data/dms/dms_upload/file/参考投书.docx |
/data/uploads/澄清公告.pdf |
CLA_FILE |
true | /data/uploads/澄清公告.pdf |
Linux / macOS Shell:
curl -X POST "https://api.example.com/api/v1/files/validate" \
-H "Content-Type: application/json" \
--data '{"file_path":"static/file/参考投书.docx","file_role":"REFERENCE_BID","is_absolute":false}'
PowerShell:
$body = @{
file_path = "static/file/参考投书.docx"
file_role = "REFERENCE_BID"
is_absolute = $false
} | ConvertTo-Json
Invoke-RestMethod -Method Post `
-Uri "https://api.example.com/api/v1/files/validate" `
-ContentType "application/json; charset=utf-8" `
-Body ([System.Text.Encoding]::UTF8.GetBytes($body))
HTTP 200,DOCX 示例:
{
"valid": true,
"file_type": "docx",
"is_text_pdf": null,
"file_role": "REFERENCE_BID",
"resolved_path": "/data/shenqin/file/参考投书.docx",
"filename": "参考投书.docx",
"size": 12345,
"sha256": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
"message": "文件检测通过"
}
| 字段 | 类型 | 说明 |
|---|---|---|
valid |
boolean | 成功时为 true |
file_type |
string | docx 或 pdf |
is_text_pdf |
boolean / null | PDF 成功时为 true;DOCX 为 null |
file_role |
string | 请求中的业务用途,仅 JSON 路径模式返回 |
resolved_path |
string | 实际选中源文件的完整路径,仅 JSON 路径模式成功时返回 |
filename |
string | 文件名,不含目录 |
size |
integer | 检测文件大小,单位字节 |
sha256 |
string | 检测内容的 SHA-256,64 位十六进制字符串 |
message |
string | 展示或排查用提示语,不要按文案字符串做业务判断 |
PDF 成功时 file_type="pdf"、is_text_pdf=true,其余字段规则一致。
检测后应将同一份内容入库;文件可能被替换时,可用摘要确认内容一致。
可处理的检测/参数错误返回非 2xx 状态码,并统一包含以下字段:
| 字段 | 类型 | 说明 |
|---|---|---|
valid |
boolean | false |
message |
string | 失败原因;能解析路径时包含完整源路径或所有完整候选路径 |
detail |
string | 与 message 相同,兼容原有读取 detail 的调用方 |
resolved_path |
string / null | 只有一个已确定源路径或候选时返回该完整路径;不代表文件一定存在。多个候选或无法解析时为 null |
candidate_paths |
array[string] | 本次已确定的完整源路径或未找到文件时的完整候选列表;无法解析时为空数组 |
message 中的完整路径是清理 static、拼接业务目录后的服务端路径,不是用户传入的
部分路径,也不是内部检测临时副本路径。路径分隔符以实际服务端系统为准。
HTTP 400:
{
"valid": false,
"message": "REFERENCE_BID 不是有效的 DOCX 文件;完整文件路径:/data/shenqin/file/参考投书.docx",
"detail": "REFERENCE_BID 不是有效的 DOCX 文件;完整文件路径:/data/shenqin/file/参考投书.docx",
"resolved_path": "/data/shenqin/file/参考投书.docx",
"candidate_paths": ["/data/shenqin/file/参考投书.docx"]
}
无文字 PDF、文件为空、文件无法读取、格式不支持、文件超限等场景同样包含完整源路径, 具体原因和 HTTP 状态码不同。
HTTP 400(按上文示例目录配置):
{
"valid": false,
"message": "REFERENCE_BID 在 REFERENCE_DIR 和 REFERENCE_DIR1 下均不存在: file/参考投书.docx;完整文件路径:/data/shenqin/file/参考投书.docx;/data/dms/dms_upload/file/参考投书.docx",
"detail": "REFERENCE_BID 在 REFERENCE_DIR 和 REFERENCE_DIR1 下均不存在: file/参考投书.docx;完整文件路径:/data/shenqin/file/参考投书.docx;/data/dms/dms_upload/file/参考投书.docx",
"resolved_path": null,
"candidate_paths": [
"/data/shenqin/file/参考投书.docx",
"/data/dms/dms_upload/file/参考投书.docx"
]
}
只配置了一个参考目录时,仅列出该目录对应的候选路径。
例如相对模式未配置 TPC_DIR,HTTP 400:
{
"valid": false,
"message": "TENDER_FILE 为相对路径,但未配置 TPC_DIR",
"detail": "TENDER_FILE 为相对路径,但未配置 TPC_DIR",
"resolved_path": null,
"candidate_paths": []
}
必填参数缺失、业务用途无效、JSON 格式错误等发生在路径解析之前,也无法提供完整路径; 服务会明确返回原因,不会猜测配置目录或虚构文件路径。
| 状态码 | 含义及处理 |
|---|---|
| 200 | 检测通过;确认 valid=true 后继续入库 |
| 400 | 文件不存在/无法读取/为空、后缀或内容无效、PDF 加密或无文字、路径配置缺失、JSON 语法错误等;读取 message 排查 |
| 413 | 超过 PROPOSA_API_MAX_UPLOAD_MB 文件大小限制 |
| 415 | 请求 Content-Type 不是 application/json 或 multipart/form-data |
| 422 | JSON 三个必填字段缺失/类型不正确/用途无效,或上传字段缺失、不是文件、上传多个文件 |
网络异常、网关错误或未处理的服务异常(例如 HTTP 500)不能视为检测通过;这些响应不保证
包含本接口的 JSON 字段。建议保存 HTTP 状态码和响应正文,若存在 message 优先展示它。
.docx、.pdf,不区分大小写;同时检查实际内容,不只检查后缀或 MIME。.doc、普通 ZIP、无效主文档会被拒绝。DOCX 不要求包含文字。PROPOSA_API_MAX_UPLOAD_MB,默认 512 MB;JSON 本地路径也受此限制。
PDF 检测会读入内存,服务端应按容量设置上限。无需服务端文件路径时,可使用 multipart/form-data 上传一个小写 file 字段。
该模式不需要 file_path、file_role、is_absolute,不参与业务目录拼接。
curl -X POST "https://api.example.com/api/v1/files/validate" -F "file=@待检测文件.pdf"
成功字段与第 3 节相同,但不包含 file_role 和 resolved_path。
失败使用第 4 节的统一结构;由于不存在服务端源路径,resolved_path=null、
candidate_paths=[],message 仅包含失败原因,不暴露内部临时路径。
服务部署后可在 /docs 试用接口,/openapi.json 提供机器可读的请求契约。