mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4mobile wallpaper 5mobile wallpaper 6
2178 字
6 分钟
Cloudflare R2 对象存储的使用
2025-12-06
无标签

对象储存介绍#

对象存储(Object Storage)是一种用来保存海量文件的现代化数据存储方式,常用于图片、视频、音频、文档、备份、静态资源等“不需要频繁修改”的数据。

它是云时代最常见的存储方式之一,比如:

  • Cloudflare R2
  • 阿里云 OSS
  • 腾讯云 COS
  • 亚马逊 S3
  • 七牛云 Kodo

Cloudflare R2介绍#

Cloudflare R2 是一款兼容 S3 API 的对象存储服务,最大特点是 无出口流量费,非常适合存放图片、视频、静态资源、文件下载等。只要你绑了卡就能使用,而且量大管饱,反观阿里oss只能试用3个月而且量小不管饱😭。

本文将从 注册账号 → 创建 Bucket → 获取 Key →创建桶 来一步步实现

步骤如下#

1. 访问 Cloudflare 官网#

https://dash.cloudflare.com

访问官网注册一个账号

2. 注册完成后点击右侧对象存储#

3.绑定支付方式(中国大陆用户:通过 PayPal 完成)#

Cloudflare 的银行卡绑定只有这四种 ,国内的银联不能绑,但它支持PayPal来绑定。

所以大陆用户推荐路径:国内银行卡 → PayPal HK → Cloudflare Billing → 启用 R2。

所以我们通过Paypal来绑定,并且要使用的是 PayPal 香港站(https://www.paypal.com/hk),注册并绑定你的银行卡。

完成后再在这个页面点击这个完成绑定。

注:PayPal国内网站个人用户是无法绑定卡的。

因此,国内用户要成功绑定 Cloudflare 的可行方法就是:用 PayPal 香港站注册账号 → 用它绑定国内银行卡 → 再绑定 Cloudflare。

4、启用 Cloudflare R2 服务#

完成绑定后就能免费使用啦!个人使用完全用不完!

能创建对象存储桶了,点击右上角蓝色按钮创建桶

给桶取个名称就能使用了

5.其他设置#

r2桶的设置很多,例如自定义域 ,需要你的域名在Cloudflare里,否则只能使用公共开发 URL来访问

如果你想在Java或者其他语言访问 R2,都必须先创建 API Token(API 令牌)

API Token 就是一串 授权密钥,允许你的程序以安全的方式访问 Cloudflare 的服务,例如:访问 R2 的对象,上传文件,删除文件,管理 Bucket等等

简单来说:

API Token = 程序访问 Cloudflare 的密码
和账号密码不一样,它是“可控权限、可控范围、可随时撤销”的专用密钥。

设置实在是太多了所以我请我们的gpt大人给我们讲解部分,其他的就留给你们自己探索吧!

以下由gpt生成#

. Bucket 的设置与管理(R2 存储桶配置详解)#

创建完一个 Bucket(存储桶)之后,R2 还提供许多实用的配置,让你可以控制权限、访问、生命周期、跨域、绑定域名等功能。

这部分的内容非常关键,特别是你要把 R2 用作:

  • 图床
  • 静态资源托管
  • 网站图片存储
  • 后端服务文件上传
  • 用户上传系统

下面是所有你必须知道的 bucket 配置。


5.1. Bucket 权限设置(Public / Private)#

R2 的桶权限只有两种:

Public(公开)#

任何人都能访问文件,适用于:

  • 图床
  • 网站静态资源
  • 前端直接访问的图片 / 视频

开启 Public 后 URL 形式:

https://<account-id>.r2.cloudflarestorage.com/<bucket>/<key>

Private(私有)#

文件无法直接访问,必须使用:

  • 临时签名(Pre-signed URL)
  • Worker 代理访问
  • 后端中转访问

适用于:

  • 用户文件
  • 付费资源
  • 后端业务的数据

在 R2 的界面可以直接切换权限,非常简单。


5.2. CORS 设置(跨域资源共享)#

如果你要从浏览器读取 R2 的文件、上传文件、调用 API,就必须配置 CORS

推荐最通用的配置:

允许跨域 GET/PUT 的基本配置:#

  • Allowed Methods:

    GET, PUT, HEAD, POST, DELETE
  • Allowed Origins:

    *

    或你的域名:

    https://yourdomain.com
  • Allowed Headers:

    *
  • Max Age:

    86400

这个配置适用于 前端直传、图床、博客资源、静态站点


5.3. 自定义域名绑定(强烈推荐)#

默认域名:

https://<account-id>.r2.cloudflarestorage.com/

不方便记,也不利于 SEO,因此你可以通过 Cloudflare Worker 将你的域名映射到 R2:

例如:

https://img.xxx.com/logo.png

绑定步骤:

  1. 创建 Worker 并关联 R2 Bucket
  2. 加 Route,将 Worker 绑定到你的域名
  3. 设置缓存(可选)

这也是使用 R2 最专业的做法。


5.4. 生命周期规则(LifeCycle Rule)#

类似于 OSS 的生命周期,有以下用途:

  • 自动删除过期文件(比如临时文件 7 天后清理)
  • 控制存储成本
  • 清理生成的缓存文件
  • 删除上传失败的对象

示例规则:

删除 30 天前上传的所有 .tmp 文件

你可以通过:

R2 → Lifecycle → Create Rule

来创建。


5.5. 存储桶加密(默认开启)#

R2 自动对所有对象进行服务器端加密(Server-Side Encryption)。

你不需要额外设置,但可以在:

Security → Object Encryption

查看加密方式(Cloudflare 托管密钥)。


5.6. 防止对象覆盖(Object Lock)#

启用后:

  • 相同的 key 无法被覆盖
  • 必须先删除才能上传同名文件
  • 适用于日志、备份、不允许覆盖的业务

很多云厂商收费,R2 免费。


5.7.. Workers 集成(R2 的最强能力)#

你可以让 Worker 和 R2 结合来做:

  • 私有桶访问控制
  • 生成临时访问链接
  • 对文件进行裁剪 / 压缩 / 处理
  • 防盗链
  • 下载限速
  • 累计下载次数等业务逻辑

示例 Worker:

export default {
async fetch(request, env) {
const object = await env.MY_BUCKET.get("logo.png");
return new Response(object.body, {
headers: { "Content-Type": object.httpMetadata?.contentType }
});
}
};

这能让 R2 变成“带业务逻辑的对象存储”。


5.8. 设置文件的 HTTP Metadata(非常重要)#

很多文件需要正确的 Content-Type,否则访问会出问题。

常用类型:

文件Content-Type
.jpg / .jpegimage/jpeg
.pngimage/png
.jstext/javascript
.csstext/css
.jsonapplication/json
.mp4video/mp4
.pdfapplication/pdf

在上传时(Java SDK)可以设置:

PutObjectRequest put = PutObjectRequest.builder()
.bucket("my-bucket")
.key("logo.png")
.contentType("image/png")
.build();

否则 Worker 返回时会是 application/octet-stream


5.9. 对象版本管理(Versioning)#

开启后:

  • 覆盖同名对象时会自动生成版本号
  • 可以回滚到旧版本
  • 类似 Git 的文件管理方式

适合敏感文件、文档、历史备份。


6.Java Spring Boot 最简单使用 Cloudflare R2 - 文字讲解#

Cloudflare R2 是一个 兼容 AWS S3 协议的对象存储
对 Java 来说,它的好处就是:

只要能连 S3,就能连 R2
不需要任何 Cloudflare 专用 SDK。

所以,在 Spring Boot 里操作 R2,其实就是:
用 AWS S3 SDK + 改 endpoint


6.1. 配置 R2 访问密钥(application.yml)#

R2 会给你:

  • Account ID
  • Access Key
  • Secret Key
  • Bucket 名称

把这些写进 Spring Boot 的 application.yml

cloudflare:
r2:
account-id: xxxxxxxxxxxxxxxxxxxxxxxx
access-key: your_access_key_here
secret-key: your_secret_key_here
bucket-name: my-bucket

Spring Boot 会自动把它们注入到配置类里。


6.2. 引入 AWS S3 依赖#

因为 R2 采用 S3 协议,所以 Java 直接使用 AWS 官方的 S3 SDK:

<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3</artifactId>
<version>2.25.20</version>
</dependency>

这个依赖提供:

  • 上传文件
  • 下载文件
  • 删除文件
  • 生成访问 URL

全部通用,不需要额外库。


6.3. 创建一个 R2Client(核心)#

连接 R2 的关键就是:

把 AWS 的 S3 endpoint,换成 Cloudflare 的 R2 endpoint。

格式是:

https://<account-id>.r2.cloudflarestorage.com

所以我们写一个配置类:

@Bean
public S3Client r2Client() {
return S3Client.builder()
.region(Region.US_EAST_1) // 固定
.endpointOverride(URI.create("https://" + accountId + ".r2.cloudflarestorage.com"))
.credentialsProvider(StaticCredentialsProvider.create(creds))
.build();
}

这样,S3Client 就不再访问 AWS,而是访问 Cloudflare R2。


6.4. 上传文件的实现逻辑(最简单版本)#

上传文件其实就三步:

  1. 前端上传文件 → Spring 接收 MultipartFile
  2. 把文件流交给 r2Client
  3. 指定 bucket 和 key 即可上传
public String upload(String key, InputStream inputStream) {
r2Client.putObject(
PutObjectRequest.builder()
.bucket(bucketName)
.key(key)
.build(),
RequestBody.fromInputStream(inputStream, inputStream.available())
);
return key;
}

R2 就会自动保存这个对象。


6.5. Controller 接口(让用户能上传)#

为了让前端能上传文件,我们写了一个简单的接口:

@PostMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file)

这个接口做的事情:

  • 接收 file(前端上传的文件)
  • 生成一个 key(也就是对象在 R2 的路径)
  • 调用 service 上传
  • 返回 key 给前端

这就完成了整个文件上传流程。


最终效果#

当你启动项目并访问:

POST http://localhost:8080/r2/upload

上传一个图片,例如 hello.png,R2 上会出现:

uploads/hello.png

这就是一个最简单、可运行、最容易理解的 Java Spring Boot × Cloudflare R2 上传文件 示例。

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Cloudflare R2 对象存储的使用
https://csa.fur1na.top/posts/cloudflare-r2-对象存储的使用/
作者
fur1na
发布于
2025-12-06
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

封面
Sample Song
Sample Artist
封面
Sample Song
Sample Artist
0:00 / 0:00