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

就会返回文件列表:

相关推荐
aou2 小时前
让表格式录入像 Excel 一样顺滑
前端·ai编程
前端付豪2 小时前
必知 Express和 MVC
前端·node.js·全栈
重铸码农荣光2 小时前
CSS 也能“私有化”?揭秘模块化 CSS 的防坑指南(附 Vue & React 实战)
前端·css·vue.js
南囝coding2 小时前
CSS终于能做瀑布流了!三行代码搞定,告别JavaScript布局
前端·后端·面试
ccnocare2 小时前
git 创建远程分支
前端
全栈王校长2 小时前
Vue.js 3 项目构建神器:Webpack 全攻略
前端
Anita_Sun2 小时前
Lodash 源码解读与原理分析 - Lodash 对象创建的完整流程
前端
米诺zuo2 小时前
TypeScript 知识总结
前端
米饭同学i2 小时前
微信小程序实现动态环形进度条组件
前端·微信小程序