不限流量!Cloudflare R2对象存储如何使用

对象存储相信很多人都有所耳闻,例如腾讯云 COS、阿里云 OSS、七牛云 KODO 等。那么,为什么我们还要使用 Cloudflare R2 呢?答案在于它拥有独特的优势:不限访问流量。

对于对象存储来说,流量费用是一项不小的支出。Cloudflare 直接免除流量费用,堪称慈善大佛。不过,我们也不要过度薅羊毛。前几天,某网友在 X 上发布帖子,称自己因为一个月消耗了 1PB 流量,差点被封号。

一个月 1PB 流量,1.43 亿请求数,平均每天 50TB 流量。1PB 什么概念?来看看 1PB 流量在阿里云要多少大洋。

差不多到 43W,太恐怖了!慈善公司也不能这么玩呀。后面作者作出解释,是由于某知名成人社区用来当官方图床了,咳,看来类似网站的需求量很大嘛。

上面提到了流量费也仅仅是 CDN 的费用,实际其他对象存储服务还会有 CDN 回源的流量费和存储容量费,按 1PB 来算也是一笔巨款。那么,Cloudflare R2 是怎么收费的?来看看下图:

Cloudflare R2 主要靠存储容量收费,10G 以内是免费的,对于写写博客做个图床完全是够用的。就算是收费也不贵,100G 差不多也就 10 大洋多点。A 类操作和 B 类操作是指一些读写操作,应该没有多少网站能超过这个数。总的来说,的确够实惠。

那要怎么使用呢?首先你得有个 Cloudflare 账号,怎么注册就不说了,相信不会有什么难度。直接来看看创建一个存储桶:

  1. 登录后,切换到 R2 页面;
  2. 点击创建存储桶;
  3. 填写一个名称,然后创建就完成了。

默认情况下,没有配置域名是不可用链接访问资源的,可以在设置里面启用 r2.dev 访问。

然后在对象文件详情里面就能看到访问链接了。

如果你有自己的域名,并且由 Cloudflare 管理,还可以使用自定义域名。

作为程序员,当然要考虑怎么用代码实现上传、读取、删除等操作。官方提供了 2 种操作方式,包括 Workers API 和 S3 SDK。

Workers API

Cloudflare Workers 是一个服务器托管的执行环境,可以在全球分布的 Cloudflare 数据中心中运行 JavaScript 代码。

创建项目

运行下面的指令创建项目,按照提示操作即可。

sh 复制代码
npm create cloudflare@latest

配置

新建项目下面已经包含配置模板,只要配置帐户 ID 和存储桶名称即可。

账户 ID 可以在页面右上角找到。

代码编写

ts 复制代码
export default {
  async fetch(request: Request, env: Env) {
    const url = new URL(request.url)
    const key = url.pathname.slice(1)

    switch (request.method) {
      case 'PUT':
        await env.MY_BUCKET.put(key, request.body)
        return new Response(`Put ${key} successfully!`)
      // 省略其他操作
    }
  },
}

代码编写完成之后,使用npm run deploy部署。部署成功,通过域名加文件名称作路径即可上传。

S3

R2 实现了 AWS S3 API,也就是可以直接使用 AWS S3 对象存储服务的 SDK。通过 S3 API 可以直接调用操作,在调用之前先要创建 API 令牌。

在账户 ID 下面找到管理 R2 API 令牌,进入创建 API 令牌。

创建完成之后,保留下这些参数。

然后可以使用 Nodejs 进行调用上传。

js 复制代码
import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3'

const S3 = new S3Client({
  region: 'auto',
  endpoint: `https://${ACCOUNT_ID}.r2.cloudflarestorage.com`,
  credentials: {
    accessKeyId: ACCESS_KEY_ID,
    secretAccessKey: SECRET_ACCESS_KEY,
  },
})

const input = {
  Body: 'file content',
  Bucket: 'web',
  Key: '1.png',
}

const command = new PutObjectCommand(input)
const response = await S3.send(command)

上传调用也很简单。这里就不详细介绍每个要点,有需要的可以自行查阅文档。

相关推荐
CodeSheep1 分钟前
“渐渐能理解为何不愿意雇佣35岁以上程序猿。去年换了份工作,组里4位组员其中3位40+,发现其实最大的问题并不是说精力不济卷不动”
前端·后端·程序员
摸鱼的春哥18 分钟前
【实战】吃透龙虾🦞,你写的Agent也能支持Skills渐进式披露
前端·javascript·后端
恋猫de小郭31 分钟前
你还用 IDE 吗? AI 狂欢时代下 Cursor 慌了, JetBrains 等 IDE 的未来是什么?
前端·flutter·ai编程
明月_清风37 分钟前
拒绝盲目 Git:VS Code 神级插件 GitLens 的 9 个进效杀手锏
前端·git
孟祥_成都39 分钟前
用 AI,0 基础复刻网页顶级特效!😀
前端·javascript·vibecoding
万少8 小时前
小龙虾(openclaw),轻松玩转自动发帖
前端·人工智能·后端
Jagger_9 小时前
抱怨到躺床关灯的一次 DIY 记录
前端
陈随易12 小时前
前端大咖mizchi不满Rust、TypeScript却爱上MoonBit
前端·后端·程序员
whinc14 小时前
🚀 两年小程序开发,我把踩过的坑做成了开源 Skills
前端·微信小程序·ai编程