多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Cloudflare Computer上传管道详解:base32、MIME识别与SigV4签名三件套完整指南

Cloudflare Computer上传管道详解:base32、MIME识别与SigV4签名三件套完整指南 Cloudflare Computer上传管道详解base32、MIME识别与SigV4签名三件套完整指南【免费下载链接】computerGive your agent a computer 项目地址: https://gitcode.com/GitHub_Trending/computer1/computerCloudflare Computer是让 AI Agent 拥有一台电脑的开源项目它把持久化虚拟文件系统装进 Durable Object并让 Agent 能把生成的图表、截图、构建产物一键变成可分享的限时链接。本文详解这条上传管道背后的三件套——base32 随机密钥、MIME 类型识别与SigV4 预签名 URL带你快速看懂它如何在不暴露存储桶的前提下安全地分享文件。上传管道能做什么一次 share 调用核心入口是 index.ts 中的createAssets它一次性绑定工作区Workspace和 R2 存储桶之后每次调用share(path, opts)就会完成三件事把虚拟文件系统里的文件流式上传到 R2 对象存储为对象写入Content-Type、Content-Disposition等元数据返回一个限时有效的预签名 GET URL谁拿到链接谁就能下载直到过期。 典型场景Agent 在沙箱里跑出一张图表调用一次分享接口就把 URL 丢进聊天消息——存储桶名、凭证、工作区目录结构全程不外泄。第一件base32 生成唯一且短的资源密钥为什么不用 UUID上传时每个对象需要一个 key对象在桶里的文件名。如果直接用 UUID是 36 个带连字符的字符而 base32.ts 采用Crockford base32 编码把 16 字节随机数压成约 26 个纯小写字母数字更短、URL 安全、无歧义字母表去掉了易混的 I、L、O、U。资源密钥的命名规则密钥格式在 upload.ts 中定义prefix/id/文件名id每次调用都重新生成同一个文件分享两次会得到两个不同的 key互不覆盖两条链接各自独立只落 basename分享/workspace/secret/plans/q3.pdf只会生成prefix/id/q3.pdf目录结构永远留在工作区内路径保持私密。解码时还对大小写和易混字母做了兼容如O→0、I/L→1即使人工转录过 token 也能还原。第二件MIME 识别给文件标上正确的 Content-Type轻量查表不拖慢体积mime.ts 内置了一张迷你扩展名 → 类型表图片png/jpg/webp/avif、文本代码md/csv/json/yaml、文档pdf、压缩包zip/gz/tar和音视频mp4/mp3/wav共 30 余项——刚好覆盖 Agent 最常分享的文件类型避免把上百条目的 MIME 大数据库打进 bundle。识别规则很简单取文件名最后一个.之后的扩展名忽略大小写去查表查不到就回退到application/octet-stream。两个可以覆盖的默认值contentType选项调用方更懂业务时可强制指定类型永远优先于查表结果dispositioninline默认浏览器直接渲染适合图片/PDF或attachment强制下载文件名还支持 RFC 5987 的filename*编码中文等 Unicode 文件名也能正确还原。第三件SigV4 签名造出限时可访问的 URL不引依赖自己实现预签名sigv4.ts 实现了一个极简版 AWS Signature Version 4query-string 预签名风格只保留 R2 的 S3 兼容端点所需的 presigned-GET 路径整个算法就是几轮 HMAC-SHA256 套在确定性字符串上规范化请求 → 待签名串 → 签名密钥按 日期/区域/服务 逐层派生→ 最终签名拼进 URL 查询参数GET 请求的负载标记为UNSIGNED-PAYLOAD不读取也不哈希文件内容URL 纯粹是输入与时间的函数生成零成本有效期expiresIn由调用方毫秒数换算而来上限 7 天AWS/R2 的预签名最长寿命。 安全设计R2 的 binding 本身不能签发 URL所以要额外提供 API token 的 access/secret key缺凭证时createAssets会在启动时报出具体缺哪个值而不是事后抛一个看不懂的 403。为大文件准备的流式哈希模块还保留了一个sha256HexStream对ReadableStream增量哈希内存里永远只有一块数据多 GB 的文件也能常空间算完——为将来直接签名上传负载留了后路。三件如何配合一次 share 的完整流程生成 keyrandomId()产出 base32 token拼上规范化后的 prefix 与文件名推断类型查 MIME 表或用你传入的contentType连同 Content-Disposition 一起准备元数据流式上传R2 要求已知长度的流所以 VFS 读出的流会被包进FixedLengthStream长度来自fs.stat边读边传全程不缓冲失败时通过 AbortController 干净地中断管道写入自定义元数据源路径、会话 ID、过期时间戳方便日后按 R2 生命周期规则或元数据清理对象签发链接调用presignUrl把带签名的 GET URL 返回给调用方。官方设计文档在 14_assets_interface.md里面有完整的选项表和配置对照环境变量回退顺序R2_ACCESS_KEY_ID→AWS_ACCESS_KEY_ID等。快速上手让 Agent 自己发链接管道已经以两种形态开箱即用AI 工具publish.ts 提供publish工具Agent 传入工作区路径可选有效期默认 1 小时直接拿回限时 URLShell 命令worker backend 的 just-bash 环境里可执行assets publish path [expiry]链接直接写到 stdout支持ms/s/m/h后缀。小结组件职责关键词亮点base32生成 26 字符短随机密钥唯一、URL 安全、路径私密MIME按扩展名推断 Content-Type轻量查表、可覆盖SigV4签发限时预签名 URL零依赖、UNSIGNED-PAYLOAD、7 天上限三者各司其职让 Cloudflare Computer 的上传管道在流式零缓冲的前提下完成了从沙箱里的一个文件到任何人都能打开的限时链接的全部工作。【免费下载链接】computerGive your agent a computer 项目地址: https://gitcode.com/GitHub_Trending/computer1/computer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表