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) })
})

就会返回文件列表:

相关推荐
乔江seven12 分钟前
【python轻量级Web框架 Flask 】2 构建稳健 API:集成 MySQL 参数化查询与 DBUtils 连接池
前端·python·mysql·flask·web
Alaaaaaaan20 分钟前
[DevOps]使用github-action工具部署docker容器(实现提交代码一键推送部署到服务器)
服务器·前端·docker·容器·github
摇滚侠43 分钟前
css 设置边框
前端·css
星爷AG I1 小时前
9-24 视觉叙事(AGI基础理论)
前端·人工智能
2501_940007891 小时前
Flutter for OpenHarmony三国杀攻略App实战 - 鸿蒙适配与打包发布
前端·flutter
css趣多多1 小时前
跨域问题及Vue项目中本地/线上解决方法核心总结
前端
光影少年1 小时前
前端 AIGC
前端·aigc
启山智软1 小时前
供应链商城核心功能模块清单
java·前端·开源
徐同保2 小时前
Claude Code提示词案例(开发复杂动态路由详情页面)
前端
Σdoughty2 小时前
python第三次作业
开发语言·前端·python