跳转到内容
搜索文档

将 R2 用作 Cloudflare Pages 的静态资源存储

最后更新 查看 MarkdownAgent 设置

本教程将教你如何使用 R2 作为 Pages 应用的静态资源存储桶。若你遇到 Pages 的文件数量限制最大文件大小限制,这尤其有用。

为说明如何实现,我们将使用 R2 作为虚构猫咪博客的静态资源存储。

猫咪博客

假设你运营一个静态猫咪博客,包含有趣的猫咪视频和实用的养猫技巧。博客正在增长,你需要添加更多包含猫咪图片和视频的内容。

博客托管在 Pages 上,当前目录结构如下:

.
├── public
│   ├── index.html
│   ├── static
│   │   ├── favicon.ico
│   │   └── logo.png
│   └── style.css
└── wrangler.jsonc

添加更多视频和图片会很好,但我们的资源大小超过了 Pages 文件限制。让我们用 R2 来解决这个问题。

创建 R2 存储桶

第一步是创建 R2 存储桶来存储静态资源。可通过仪表板或使用 Wrangler 创建新存储桶。

使用仪表板时,导航到 R2 选项卡,然后点击 Create bucket。我们将博客的存储桶命名为 cat-media。请始终为存储桶使用描述性名称:

Dashboard

创建存储桶后,我们可以将媒体文件上传到 R2。我将拖放两个包含若干猫咪图片和视频的文件夹到 R2 存储桶:

Upload

或者,可以使用 Wrangler 从命令行创建 R2 存储桶:

npx wrangler r2 bucket create <bucket_name>
# i.e
# npx wrangler r2 bucket create cat-media

可以使用以下命令将文件上传到存储桶:

npx wrangler r2 object put <bucket_name>/<file_name> -f <path_to_file>
# i.e
# npx wrangler r2 object put cat-media/videos/video1.mp4 -f ~/Downloads/videos/video1.mp4

将 R2 绑定到 Pages

要将创建的 R2 存储桶绑定到猫咪博客,需要更新 Wrangler 配置。

打开 Wrangler 配置文件,向文件添加以下绑定。bucket_name 应为之前创建的存储桶的确切名称,binding 可以是引用 R2 资源的任意自定义名称:

{
	"r2_buckets": [
		{
			"binding": "MEDIA",
			"bucket_name": "cat-media"
		}
	]
}
[[r2_buckets]]
binding = "MEDIA"
bucket_name = "cat-media"

保存 Wrangler 配置文件,即可进入最后一步。

或者,可以在仪表板上为 Pages 项目添加绑定:导航到项目的 Settings 选项卡 > Functions > R2 bucket bindings

从 Pages 提供 R2 资源

最后一步是从 R2 在博客上提供媒体资源。为此,我们将创建一个函数来处理媒体文件请求。

在项目文件夹中,创建 functions 目录。然后创建 media 子目录,并在其中创建名为 [[all]].js 的文件。所有对 /media 的 HTTP 请求都将路由到此文件。

创建文件夹和 JavaScript 文件后,博客目录结构应如下:

.
├── functions
│   └── media
│       └── [[all]].js
├── public
│   ├── index.html
│   ├── static
│   │   ├── favicon.ico
│   │   └── icon.png
│   └── style.css
└── wrangler.jsonc

最后,我们在 [[all]].js 中添加处理函数。此函数接收所有媒体请求,并从 R2 返回相应的文件资源:

export async function onRequestGet(ctx) {
	const path = new URL(ctx.request.url).pathname.replace("/media/", "");
	const file = await ctx.env.MEDIA.get(path);
	if (!file) return new Response(null, { status: 404 });
	return new Response(file.body, {
		headers: { "Content-Type": file.httpMetadata.contentType },
	});
}

部署博客

在部署到目前为止所做的更改之前,让我们在 index.html 中添加几篇新文章。这些文章依赖从 R2 提供的媒体资源:

<!doctype html>
<html lang="en">
	<body>
		<h1>Awesome Cat Blog! 😺</h1>
		<p>Today's post:</p>
		<video width="320" controls>
			<source src="/media/videos/video1.mp4" type="video/mp4" />
		</video>
		<p>Yesterday's post:</p>
		<img src="/media/images/cat1.jpg" width="320" />
	</body>
</html>

保存所有文件后,打开新的终端窗口部署应用:

npx wrangler deploy

部署后,媒体资源将从 R2 存储桶获取并提供。

已部署的应用

相关资源

这篇文档对您有帮助吗?