uni-app 无法直接将二进制数据存入剪贴板,所有平台仅支持文本;必须先转为 Base64 字符串再调用 uni.setClipboardData,否则静默失败;H5 端不支持富媒体粘贴,App 和小程序也受限于字符串限制,跨端唯一可行方案是统一转 Base64 后复制。

uni-app 无法直接把二进制数据(如 ArrayBuffer、Blob)存入剪贴板。所有平台都只支持文本内容,所谓“存二进制”,本质是先转成 Base64 字符串再复制。
uni.setClipboardData 只接受字符串,传 ArrayBuffer 或 Blob 会静默失败
这个 API 的 data 参数类型严格限定为 string。如果你传 new Uint8Array([1,2,3])、blob 或 arrayBuffer,它不会报错,但剪贴板内容不变,success 回调也不会触发——这是最常被忽略的静默陷阱。
- 必须手动将二进制数据编码为 Base64 字符串,例如用
btoa(String.fromCharCode(...new Uint8Array(arrayBuffer)))(仅限小数据) - 更稳妥的做法是用
FileReader的readAsDataURL(适用于 Blob),再截掉前缀:data:image/png;base64,iVBORw...→ 提取iVBORw... - App 和小程序端可用
uni.getFileSystemManager().readFile配encoding: 'base64'直接读出 Base64 字符串
H5 端 navigator.clipboard.writeText 不支持非字符串,且不认 data URL
即使你构造了 data:image/png;base64,... 这种字符串,navigator.clipboard.writeText() 也只会把它当纯文本存进去——粘贴出来就是一长串字符,不是图片。浏览器剪贴板对富媒体(图片、文件)的支持需走 navigator.clipboard.write() + ClipboardItem,但 uni-app H5 模式下该 API 不可用(受限于 WebView 实现和安全策略)。
- 别试图让 H5 粘贴出图片:用户粘贴到 Word、微信等地方,得到的永远是文本
- 真要支持图片粘贴,得降级为下载文件(
plus.io.writeFile+plus.runtime.openFile)或唤起分享(uni.share) - 如果目标只是“让用户能复制后在其他 App 里识别为图片”,目前唯一可行路径是:App 端用
plus.clipboard.writeImage(iOS/Android 原生能力),但这已超出uni.setClipboardData范畴
小程序端也不能绕过字符串限制,但可间接写入图片
微信小程序提供 wx.setClipboardData 同样只收字符串;但微信另有 wx.copyFile + wx.openDocument 组合可实现“复制文件链接并打开”,不过这不是真正写入剪贴板,而是跳转操作。
- 小程序真机上,
scope.writeClipboard权限只管文本,不管二进制 - 想让用户长按识别图片?得用
canvas渲染 +uni.canvasToTempFilePath生成本地路径,再通过uni.previewImage或分享暴露出去 - 所谓“复制图片”在小程序里本质是复制一个临时路径或网络 URL,而非二进制本身
真正跨端可行的路径只有一条:把二进制转 Base64 字符串,再用对应平台的文本复制 API。任何想绕过字符串层直接塞二进制进剪贴板的尝试,都会在某个平台卡死——尤其是 H5 下连错误都不报,只安静失效。











