1. 平台通用能力
插件化手册
  • FH2 插件开发手册
    • 产品简介
    • 典型场景
    • 发版说明
    • 快速开始
      • 快速开始总览
      • 第一个插件
      • 后端插件
      • 全栈闭环
    • AI辅助开发
      • AI 开发 Skill
      • 安装与复验
      • 第一个工程
      • 真实需求示例:现场问题上报
      • 改造已有工程
      • 调试与交付
    • 开发指南
      • 开发指南
      • 基础概念
        • 基础概念总览
        • 什么是插件开发
        • 平台架构
        • 前端宿主、扩展点与能力
        • 后端运行时、入口与权限
        • 开发流程
        • 安全与隔离
        • 支持范围与问题反馈
      • 开发指南
        • 开发指南总览
        • 前端插件
          • 前端插件深度指南
          • 前端工程结构
          • 插件清单(fh2-plugin.json)
          • 入口与生命周期
          • 界面与状态
          • 多宿主插件
          • 跨宿主通信服务
          • HTTP、WebSocket 与事件
          • 存储、Blob 与定时器
          • 工具链与本地调试页面
        • 后端插件
          • 后端开发深度指南
          • 后端插件的结构
          • 后端源清单 fh2-plugin.json
          • HTTP 接口处理函数
          • 消息订阅与事件处理函数
          • ctx 与能力注入
          • 数据存储与缓存
          • 流程编排
          • 触发方式
          • 连接外部系统
          • 流程编排练习(DAG)
        • 前后端协作
          • 前后端协作总览
          • 前后端共享契约
          • 端到端幂等
          • 事件、通知与状态
          • 统一错误模型
          • 链路标识与诊断日志
        • 完整练习
          • 环境准备
          • 第一个前端插件
          • 第一个后端插件
          • 第一个全栈插件
      • 能力总览
        • 能力地图
        • 能力可用性矩阵
        • 前端能力
          • 平台通用能力
            • 平台通用能力总览
            • 基础运行时:HTTP、事件、WebSocket 与存储
            • 导航、位置与通知
            • 弹窗、音频与剪贴板
            • 地图能力
            • 项目设备能力
            • WPMZ 与航线预览
            • 受控对象上传
          • 项目宿主
            • 项目宿主总览
            • 项目上下文
            • 项目侧边栏入口
            • 项目插件路由
            • 项目工作区
          • 消息宿主
            • 消息宿主总览
            • 消息告警弹层
            • 消息导航与通知
          • 计划库宿主
            • 计划库宿主总览
            • 计划库表单上下文
            • 计划库表单扩展
            • 校验、提交与 `biz_ext`
          • 驾驶舱
            • 驾驶舱插件能力总览
            • 驾驶舱扩展点
            • 上下文与遥测
            • 相机、检测与 AI
            • 场景几何与直播指针
            • 飞控、云台与任务
            • 驾驶舱平台事件
        • 后端能力
          • 后端能力地图
          • 后端能力总览
          • 配置、受管出网与集成连接
          • 事件与流程
          • 飞行任务与违停巡逻
          • 数据存储
          • 媒体与前端通知
          • 资源租约
          • 作业、目标轨迹与视频处理
      • 调试与测试
        • 调试与测试总览
        • 快速入门排错
        • 本地开发
        • Web IDE:打开工程与保存改动
        • 工作流编辑器:节点、接线与交付
        • 知识与 MCP:先判断需要哪一层事实
        • 前端本地调试
        • 后端运行时与流程调试
        • 模拟数据与测试数据
        • 集成测试与 E2E
        • 日志与链路追踪
        • 常见问题排查
      • 完整示例
        • 示例与案例总览
        • 项目侧边栏与工作区
        • 消息告警卡片
        • 计划表单任务清单
        • 驾驶舱动作与左侧面板
        • 最小后端插件
        • 最小全栈插件
        • 多宿主插件实战
        • 事故快处
        • 交通抓拍
        • 违停巡逻完整案例
      • 构建发布与安全
        • 构建、发布与安全
        • 质量门禁
        • 行业包构建与打包
        • 能力版本发布
        • 安装、升级与回滚
        • 安全基线
      • API参考
        • API 参考总览
        • 前端
          • 前端 API 参考
          • 前端插件清单结构
          • 前端 SDK API
          • 前端扩展点目录
          • 前端能力目录
          • 前端平台事件目录
          • 跨宿主通信服务 API
          • 工具链命令行参考(`fh2-plugin`)
        • 后端
          • 后端 API 参考
          • 后端插件源清单
          • 后端 HTTP 接口参考
          • 后端事件消费参考
          • 后端脚本上下文(`ctx`)
          • 后端数据存储
          • 流程编排语言
          • 流程触发器参考
          • 后端能力目录
          • 后端 HTTP API
        • 共享契约
          • 共享契约参考
          • 类型与契约目录
          • 错误模型
          • 版本兼容性
      • 附录
        • 错误码
        • 术语表
        • 常见问题
  1. 平台通用能力

受控对象上传

platform:object-upload 让插件在宿主同源执行环境中把一个 Blob 上传到对象存储,用于证据图片、日志包等场景。清单声明 platform:object-upload 权限,代码里 await ctx.capabilities.get('platform:object-upload') 获取并判空。
当前只在驾驶舱宿主能获取到这个能力,其他宿主(计划、消息、项目)会得到 undefined。运行环境要求由平台决定,不是插件可声明的。
fh2-plugin-sdk 是插件开发 SDK;下文模块名用于说明,实际导入路径保留生成工程配置。模块名不表示已发布的 npm 包名。

方法清单#

方法输入返回
upload临时对象存储参数 + blobPromise<{ etag: string | null }>

临时对象存储参数(怎么和后端配合)#

当前公共契约要求插件把短期临时上传参数传给宿主,由宿主执行受控 S3 putObject。这些参数应由你的后端在可信链路中签发,并通过 ctx.apiCall 获取;本页不指定签发接口路径。输入字段为:
interface ObjectUploadCredentials {
  readonly endpoint: string
  readonly bucket: string
  readonly region: string
  readonly objectKey: string
  readonly accessKeyId: string
  readonly secretAccessKey: string
  readonly securityToken: string
  readonly usePathStyle?: boolean
}
安全要求:
只接受后端为本次上传签发的短期 STS 参数,不使用长期账号或固定密钥;字段缺失时不要发起上传。
插件会接触这些临时字段。不要把它们写入日志、本地存储、诊断详情或后端以外的第三方;业务确认只传 etag 与业务对象 ID。
上传完成后,调用你的后端接口做业务确认。后端应对确认接口做幂等处理,避免确认重试造成重复记录。
宿主在上传前会做这些检查,不满足会失败:
endpoint 必须是 HTTP(S) URL;bucket 必须符合对象存储桶名规则;region、objectKey 和三个 STS 凭证字段必须是非空字符串。
blob 必须是原生 Blob;大小不超过 1 GiB。MIME 类型没有额外 allowlist,宿主会按 Blob 的实际 type 设置上传 Content-Type。
usePathStyle 可选,缺省按 path-style 访问。
注意:
etag 可能为 null,不能当业务对象 ID 用;业务 ID、下载地址由插件后端接口返回。
不要持久化临时上传参数,也不要把凭证字段、完整上传地址或对象键写进日志。
生产联调前确认后端已部署短期 STS 签发接口和上传确认接口——只有前端提供方完成不了上传。

集成片段#

先按第一个前端插件建立可运行工程。下面不是完整的 fh2-plugin.json,不可整份替换:将 permissions 去重合并到现有清单,保留现有宿主扩展、界面声明/注册和入口。权限不会触发激活;清单若只有 extensions: [],activate() 不会执行。
合并到 fh2-plugin.json 的字段:
{
  "permissions": ["platform:http", "platform:object-upload"]
}
下面的 definePlugin 只示范入口逻辑组织,不是可直接替换完整工程的入口;保留生成工程的 SDK 导入路径,将能力逻辑合入已有驾驶舱 activate,保留原有扩展贡献与界面注册。把 uploadEvidence 接到现有已声明扩展的截图/确认回调;短期参数签发和业务确认接口需由后端提供。
// plugin.ts
import { definePlugin } from 'fh2-plugin-sdk'

export default definePlugin({
  async activate (ctx) {
    // 当前只在驾驶舱宿主可用;其他宿主在这里停用上传入口。
    const objectUpload = await ctx.capabilities.get('platform:object-upload')
    if (!objectUpload) {
      ctx.logger.warn('受控对象上传在当前宿主或运行条件下不可用')
      return
    }

    async function uploadEvidence (
      jpeg: Blob,
      credentials: ObjectUploadCredentials,
      evidenceId: string,
    ): Promise<string> {
      if (jpeg.type !== 'image/jpeg') throw new Error('证据文件必须是 JPEG')
      const { etag } = await objectUpload.upload({
        endpoint: credentials.endpoint,
        bucket: credentials.bucket,
        region: credentials.region,
        objectKey: credentials.objectKey,
        accessKeyId: credentials.accessKeyId,
        secretAccessKey: credentials.secretAccessKey,
        securityToken: credentials.securityToken,
        usePathStyle: credentials.usePathStyle,
        blob: jpeg,
      })
      await ctx.apiCall('/evidence/upload-complete', {
        method: 'POST',
        body: { evidenceId, etag },
        idempotencyKey: `complete-${evidenceId}`,
      })
      return evidenceId
    }

    // 实际业务应把该函数接到明确的截图/确认动作,而不是后台自动上传。
    ctx.logger.debug('证据上传器就绪', { uploadEvidence: typeof uploadEvidence === 'function' })
  },
})

错误与生命周期#

宿主卸载会中止进行中的上传,后续调用以 HOST_RUNTIME_DISPOSED 失败;对象存储请求失败包装为 PLUGIN_GATEWAY_ERROR。错误码见错误码。
上传成功但业务确认失败时,应由后端幂等确认或回收任务处理,不能只靠前端重传。

常见问题#

现象原因与处理
get() 返回 undefined当前宿主不提供该能力(目前仅驾驶舱);该宿主隐藏上传入口即可
上传被拒绝核对临时参数是否完整、endpoint 是否为 HTTP(S)、bucket 是否合法、Blob 是否超过 1 GiB
拿不到下载地址etag 不是业务 ID;下载地址由插件后端返回
离开驾驶舱后上传中断宿主卸载会中止请求,属预期行为;业务侧重试需重新签发短期上传参数
修改于 2026-10-22 07:06:53
上一页
WPMZ 与航线预览
下一页
项目宿主总览
Built with