API 参考 / attachments
POST /api/v1/attachments · uploadAttachment
multipart/form-data 上传单个文件并关联到目标对象。表单字段:file(文件本体)、 targetType、targetId。存储 key 由服务端生成,原始文件名仅作展示元数据(防路径穿越)。 强制单文件大小上限与 MIME/扩展白名单,超限或非法类型返回 422/413。 targetType 只接受白名单内的值(requirement / work_item / bug / milestone / document / comment), 其余返回 422:未知类型既落不到任何读侧列表(永久孤儿附件),鉴权也无从对应到真实对象模块。 targetType 归一(B-00065):缺陷就是 type=bug 的工作项,故 targetType=work_item 但 targetId 指向缺陷时,服务端落库与响应一律归一成 bug(否则这条附件挂在读侧永远不查的组合上、 永久不可见);归一后按「缺陷·QA」模块 edit 重新鉴权,只有「子任务」权限不足以往缺陷传附件。 非缺陷工作项(task / dev / qa)的 work_item 不受影响。 评论附件(B-00080):targetType=comment、targetId=评论 uuid。权限与附件的通例一致 「随目标对象走」——评论的写权限是 view_project(低门槛协作动作,不占 manage_*、也不走五模块闸), 故评论附件要求 view_project 而不是宿主对象的模块 edit:能在缺陷下发评论的人就该能给自己的 评论贴截图。目标评论必须存在,不存在返回 404(挂在幽灵评论上的附件是永久不可见的孤儿)。 调用顺序:先 POST /comments 拿到评论 id,再用该 id 逐个上传附件(评论创建与附件上传是两次请求, 没有「随评论一起提交附件」的复合端点)。
鉴权:项目 API Token(Authorization: Bearer wfp_…)。详见 Agent 接入。
Idempotency-Keyfile(必填)targetType(必填)targetId(必填)id(必填)targetType(必填)targetId(必填)fileName(必填)size(必填)mimeType(必填)uploaderId(必填)createdAt(必填)id(必填)targetType(必填)targetId(必填)fileName(必填)size(必填)mimeType(必填)uploaderId(必填)createdAt(必填)403:Problem 错误响应404:Problem 错误响应409:Problem 错误响应413:Problem 错误响应422:字段校验失败,或附件类型不受支持;类型拒绝时返回结构化策略字段503:Problem 错误响应curl -X POST "https://你的项目.workflow.games/api/v1/attachments" \
-H "Authorization: Bearer wfp_…" \
-F "file=@截图.png" \
-F "targetType=requirement" \
-F "targetId=018f3c2e-0000-7000-8000-000000000000"HTTP/1.1 201
{
"id": "018f3c2e-0000-7000-8000-000000000000",
"targetType": "requirement",
"targetId": "018f3c2e-0000-7000-8000-000000000000",
"fileName": "示例标题",
"size": 1,
"mimeType": "示例文本",
"uploaderId": "018f3c2e-0000-7000-8000-000000000000",
"createdAt": "示例文本"
}合同真值:OpenAPI 3.1(0.1.0)。
相关:Agent 接入指南 · 使用指南 · API 参考索引