cloudflare+hono使用worker实现api接口和r2文件存储和下载

大家好,我的开源项目PakePlus可以将网页/Vue/React项目打包为桌面/手机应用并且小于5M只需几分钟,官网地址:pakeplus.com

步骤也很简单,就是使用命令创建一个hono创建一个基础框架,然后绑定r2对象存储,然后写上传和下载的接口,然后测试发布即可。

使用命令:

bash 复制代码
pnpm create cloudflare@latest upload-r2

然后创建后打开,绑定r2:

bucket_name 这里添加你的存储桶名称即可,没有的话,在后台页面创建一个存储桶或者使用命令行创建一个。

然后运行命令:

bash 复制代码
wrangler deploy --minify

这个主要是将绑定的存储桶R2可以在代码中使用不提示报错。

然后在index.ts中写上传逻辑:

javascript 复制代码
app.post('/upload', async (c) => {
    const form = await c.req.parseBody()
    const file = form['file'] as File
    if (!file || !file.name) {
        return c.json({ error: 'No file uploaded' }, 400)
    }
    const buffer = await file.arrayBuffer()
    const object = await c.env.R2.put(file.name, buffer)
    return c.json({ object })
})

这个代码主要就是拿到post请求中的file文件,然后使用R2存储到桶里面,写完之后会返回存储后的结果,可以本地运行测试,本地启动服务后,使用postman或者apifox都可以测试:

说明没有问题,这里可以上传任意类型的文件,访问的时候也可以访问任意类型。为什么不用Express框架?因为Express框架和cf不是很兼容,在访问视频文件或者大文件的时候,和cf不兼容,访问不到。所以强烈推荐Hono这个框架,而且Hono用起来和Express差不多,甚至更方便。

然后开始写访问文件逻辑和下载逻辑:

javascript 复制代码
app.get('/download/:key', async (c) => {
    const key = c.req.param('key')
    const object = await c.env.R2.get(key)
    if (!object) {
        return c.json({ error: 'File not found' }, 404)
    }
    return c.body(object.body)
})

这里主要就是发送get请求访问上传的文件,在apifox中访问刚才上传的文件:完美访问

还可以查询桶里面有哪些文件:

javascript 复制代码
app.get('/files', async (c) => {
    const objects = await c.env.R2.list()
    return c.json({ files: objects.objects.map((object) => object.key) })
})

就会返回文件列表:

相关推荐
Eloudy1 小时前
ReAct 原理简介
前端·javascript·人工智能·react.js·agent·gpu
ZJU_统一阿萨姆2 小时前
【DSH】如何将 DeepSeek Harness 嵌入生产环境?万字解构 DeepSeek Agent Harness 的运行机制与安全边界
前端·javascript·安全
用户921080262862 小时前
4. 前端地图大量点位实时更新优化:后端推增量,前端做 diff
前端
SoaringHeart3 小时前
Flutter最佳实践:Web项目中文字体首次加载乱码问题解决
前端·flutter
西安小哥3 小时前
破局与重生:大厂前端如何借力 AI 转型“超级全栈“
前端·人工智能
sunly_4 小时前
TypeScript总结:16、面向对象速查
前端·javascript·typescript
MXN_小南学前端4 小时前
React超长文本域中实现“返回顶部”浮动按钮
前端·javascript·react.js
学习嵌入式的小周4 小时前
Notepad++8.8.7下载安装(附安装包)
前端·notepad++
gs801404 小时前
解构 Cordis:面向“时空可组合性”的 TypeScript 元框架深度剖析
前端·javascript·typescript
岁岁种桃花儿5 小时前
Vue核心语法第一篇:Vue是什么?
前端·javascript·vue.js