datatransfer 不直接承载原始业务负载,需序列化为字符串(如json)后按mime类型存取;harmonyos next用unifieddata封装;严禁传输敏感信息,接收端须校验数据结构。

在跨应用拖拽中,DataTransfer 对象本身不直接承载“原始业务负载”(如 JSON 对象、自定义结构体或业务 ID),而是作为**标准化数据容器**,依赖 MIME 类型约定与平台机制完成语义传递。关键在于:不是把整个对象塞进去,而是用标准格式封装、用约定方式解析。
明确支持的数据类型与限制
DataTransfer 仅支持字符串化、二进制或系统预注册的格式(如 text/plain、text/uri-list、Files)。浏览器和主流平台(Web/WPF/HarmonyOS/Windows UWP)均不接受直接 setData("application/json", { id: 123, type: "task" }) —— 这会静默失败或被转为字符串 "[object Object]"。
- 必须将业务数据序列化为字符串(如 JSON.stringify)后再设置
- 目标端需按相同 MIME 类型调用 getData(),再反序列化(如 JSON.parse)
- HarmonyOS NEXT 和 Windows UWP 支持 UnifiedData 或 DataPackage 封装更丰富元信息,但底层仍需序列化落地
Web 环境下的标准实践
在网页间或网页与 PWA 应用拖拽时,推荐使用 text/plain + 自定义前缀或 application/json(需确保接收方识别):
- 拖拽源:e.dataTransfer.setData("application/json", JSON.stringify({ taskId: "T-789", status: "todo", projectId: "P-456" }))
- 放置目标:drop 事件中 e.dataTransfer.getData("application/json") → 解析为对象
- 务必在 dragover 中调用 e.preventDefault(),否则 drop 不触发
- 若需兼容旧浏览器,可用 text/plain 并加协议标识,例如:
setData("text/plain", "X-MYAPP-TASK:{\"taskId\":\"T-789\"}")
鸿蒙 NEXT 跨应用场景
HarmonyOS NEXT 不直接暴露 DataTransfer,而是通过 unifiedDataChannel.UnifiedData 构建可跨应用流转的统一数据对象:
- 发送端:创建 UnifiedData 实例,调用 .addString("business_payload", JSON.stringify(payload)) 或 .addAsset() 附加文件/图片
- 接收端:在 onDragEvent 回调中,从 event.data 获取 UnifiedData,再用 .getString("business_payload") 提取并解析
- 优势:自动处理权限校验、跨沙箱传输、多端一致性,避免手动 MIME 管理
安全与健壮性要点
原始业务负载含敏感字段时,不能依赖客户端传输完整性:
- 禁止在拖拽数据中传递 token、密码、用户身份凭证等敏感信息
- 建议只传轻量标识(如 recordId、urlHash、临时 key),由目标应用服务端查证后加载完整数据
- 接收端必须校验 JSON 结构、字段类型及必要字段存在性,防止解析异常崩溃
- 对不可信来源(如网页拖入桌面应用),应限制 MIME 类型白名单,忽略未知 format










