news 2026/10/8 5:12:17

Skybridge 文件处理指南:useFiles 与 useDownload 实现文件上传、下载与打开的完整教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Skybridge 文件处理指南:useFiles 与 useDownload 实现文件上传、下载与打开的完整教程

Skybridge 文件处理指南:useFiles 与 useDownload 实现文件上传、下载与打开的完整教程

【免费下载链接】skybridgeSkybridge is a full-stack TypeScript framework for MCP Apps and ChatGPT Apps. Type-safe. React-powered. Platform-agnostic.项目地址: https://gitcode.com/gh_mirrors/skybr/skybridge

本文带你快速上手Skybridge(一个面向 MCP Apps 与 ChatGPT Apps 的全栈 TypeScript 框架)中的两个文件处理 Hook:useFiles与useDownload。它们分别解决"文件如何进应用"(上传、选择文件)和"文件如何出应用"(保存到用户设备)两大核心问题,让你在对话式应用中轻松实现文件上传、下载与打开。

为什么 MCP Apps 需要专门的文件处理 Hook?

MCP Apps 的界面(View)运行在沙箱 iframe中,与普通网页不同:

  • 🚫 无法直接访问用户磁盘
  • 🚫 传统的<a download>、URL.createObjectURL等下载方式被拦截
  • 🚫 拿不到文件字节,只能拿到"文件引用"

Skybridge 通过宿主(ChatGPT、Claude 等)开放的桥接能力,把这套差异封装成两个简洁的 React Hook,你只需几行代码即可完成文件流转:

Hook方向支持宿主核心能力
useFiles文件进应用ChatGPT上传本地文件、从 ChatGPT 文件库选文件、解析下载链接
useDownload文件出应用Claude把应用生成的内容保存到用户设备

useFiles:三步搞定文件上传与选择

useFiles返回三个函数(源码见 use-files.ts),分别对应"传文件进来"的三条路径:

1️⃣ upload:上传本地文件

把用户从设备选中的File交给宿主存储,返回文件元信息FileMetadata(含fileId、fileName、mimeType)。注意:宿主只给你引用,不给字节——这是安全设计,也简化了传输。

import { useFiles } from "skybridge/web"; const { upload } = useFiles(); const meta = await upload(file); // meta.fileId 即为持久句柄

2️⃣ selectFiles:从 ChatGPT 文件库选文件

打开 ChatGPT 原生的文件库选择器,用户可挑选历史对话中已上传的文件授权给应用,返回一个FileMetadata数组(用户取消时为空数组)。

3️⃣ getDownloadUrl:把引用换成下载链接

fileId是持久的"钥匙",而download_url是临时缓存链接、会过期。因此最佳实践是:把fileId存进状态,需要时再用getDownloadUrl按需换取新链接:

const { downloadUrl } = await getDownloadUrl({ fileId: meta.fileId });

💡 小提示:Hook 返回的是 camelCase 字段(fileId),而传给工具的 FileRef 需要 snake_case 的file_id+ 必填的download_url,构建时要手动映射一下。

useDownload:一键把生成的文件保存到用户设备

Claude 端没有文件存储,唯一能做的"出向"操作就是让 View 把内容交还给宿主,由宿主确认后写入用户磁盘。useDownload直接返回一个download函数(源码见 use-download.ts)。

两种内容载体:

  • 内联资源(resource):文件内容直接随请求携带,文本用text字段,二进制用 base64 的blob字段
  • 资源链接(resource_link):只给一个 URL,由宿主自己去拉取(Claude 暂不支持此类型)

文件名由uri的最后一段决定,例如file:///receipt.csv会建议保存为receipt.csv。

import { useDownload } from "skybridge/web"; const download = useDownload(); const exportCsv = async () => { const csv = items.map((i) => `${i.label},${i.amount}`).join("\n"); const { isError } = await download({ contents: [{ type: "resource", resource: { uri: "file:///receipt.csv", mimeType: "text/csv", text: csv }, }], }); if (isError) console.warn("用户取消或宿主不支持下载"); };

三个关键细节:

  1. ⏰ 返回值中的isError为true表示用户取消或宿主拒绝;真正的失败(超时、断连)则会让 Promise 抛错
  2. 🖱️ 必须在用户点击等交互中触发,挂载时自动下载会被宿主拒绝
  3. 🔁 一次可传多个contents,批量保存多个文件

实战案例:聊天里压缩文件并下载

官方示例 chatgpt-files 完整演示了useFiles的闭环:用户拖拽或从文件库选择一个文件 → 应用调用zip-file工具压缩 → 返回压缩包引用 → 用户点击下载。

核心流程只有四步(完整代码见 zip-file.tsx):

  1. upload(picked)上传设备文件,拿到fileId
  2. getDownloadUrl({ fileId })换取临时下载链接
  3. 组装成FileRef(file_id+download_url)调用工具
  4. 工具返回新的file_id,再次getDownloadUrl打开下载

服务端工具则用openai/fileParams声明文件入参,宿主会自动把用户附件路由进来(示例见 server.ts)。

开发过程中,还可以用 Skybridge 自带的 DevTools 面板在本地调试 View 与工具调用:

平台兼容性速查

能力ChatGPTClaude
useFiles(upload / selectFiles / getDownloadUrl)✅❌ 抛出异常
FileRef文件参数(工具入参/出参)✅❌
useDownload(保存文件到设备)视宿主能力✅(仅内联资源)

⚠️ 记住一句话:ChatGPT 有"文件仓库"可以双向搬运文件,Claude 只有"出口"。跨平台应用应做好能力检测与降级(比如文件库不可用时回退到本地上传)。

延伸阅读

  • useFiles API 参考
  • useDownload API 参考
  • 文件处理指南(Handle Files)
  • FileRef 文件引用类型
  • useCallTool:把上传的文件转发给工具
  • useOpenExternal:在应用外打开链接

掌握useFiles与useDownload之后,你的 MCP App 就具备了完整的文件处理能力——用户上传的票据能被工具解析,应用生成的报表也能一键落盘。结合 create-skybridge 模板 快速起步,几分钟就能搭出属于你的文件处理应用 🚀

【免费下载链接】skybridgeSkybridge is a full-stack TypeScript framework for MCP Apps and ChatGPT Apps. Type-safe. React-powered. Platform-agnostic.项目地址: https://gitcode.com/gh_mirrors/skybr/skybridge

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/8 5:11:55

文本转CAD实战:一句话生成可编辑的三维参数模型

前两天一个做机械设计的哥们儿跟我吐槽&#xff0c;说客户发来一句话&#xff1a;“我要一块400300的安装底板&#xff0c;板厚5mm&#xff0c;四角倒R10圆角&#xff0c;中间按200120的间距开四个直径12的孔。”就这么一句话&#xff0c;他在CAD里拉矩形、倒圆角、定孔位、加约…

作者头像 李华
网站建设 2026/10/8 5:10:22

claude-mem:为Claude打造对话记忆持久化,告别重复自我介绍

1. 为什么我要自己动手做一个 claude-mem先说清楚这个项目是干什么的。claude-mem是一个给 Claude 这类大语言模型做对话记忆持久化的轻量工具。它解决的问题很具体&#xff1a;每次开新会话&#xff0c;模型对之前聊过什么一无所知&#xff0c;你得反复交代背景、重复贴代码、…

作者头像 李华
网站建设 2026/10/8 5:10:02

MFC CFileDialog 定制实战:从 dwFlags 到钩子与子类化的避坑指南

简介&#xff1a;这份源码资源面向具备一定 MFC 基础的 Windows 开发者&#xff0c;聚焦 CFileDialog 对话框的深度定制这一商业编程常见需求。内容围绕对话框模板改造、文件过滤器设置、自定义消息处理、扩展按钮与 IFileDialogCustomize 接口等方向展开&#xff0c;帮助读者突…

作者头像 李华
网站建设 2026/10/8 5:09:29

喀斯特矢量数据清洗与空间分析实战指南

简介&#xff1a;本资源为中国喀斯特岩溶地貌空间分布的高精度GIS矢量数据集&#xff0c;面向地理信息、地质环境、生态规划等领域的科研人员与高校师生&#xff0c;支撑岩溶区土地利用评估、水文模拟、生态保护红线划定等空间分析任务。数据以SHP格式组织&#xff0c;共8个标准…

作者头像 李华
网站建设 2026/10/8 5:09:17

永磁同步电机非线性磁链无感算法、Flux观测器+锁相环PLL仿真模型

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和数学建模资料 &…

作者头像 李华
网站建设 2026/10/8 5:09:13

agent-skills 技能包实战:用 skills CLI 约束 AI 编程助手

1. 从"agent-skills"这个标题能读出什么第一次看到agent-skills这个仓库名&#xff0c;我的直觉是&#xff1a;这大概率不是一个应用&#xff0c;而是一套"能力包"。事实也确实如此——它本质上是一个围绕 AI coding agent 构建的技能集合&#xff0c;核心…

作者头像 李华