李成笔记网

专注域名、站长SEO知识分享与实战技巧

cloudflare r2作为文件读存api使用

export default {

async fetch(request, 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!`);

case "GET":

const object = await env.MY_BUCKET.get(key);


if (object === null) {

return new Response("Object Not Found", { status: 404 });

}


const headers = new Headers();

object.writeHttpMetadata(headers);

headers.set("etag", object.httpEtag);


return new Response(object.body, {

headers,

});

case "DELETE":

await env.MY_BUCKET.delete(key);

return new Response("Deleted!");


default:

return new Response("Method Not Allowed", {

status: 405,

headers: {

Allow: "PUT, GET, DELETE",

},

});

}

},

};

这段代码是一个用于 [Cloudflare Workers](
https://developers.cloudflare.com/workers/) 的服务端脚本,**实现了一个简单的对象存储 HTTP API**。它允许用户通过 HTTP 请求(PUT、GET、DELETE 方法)对 Cloudflare R2 存储桶(MY_BUCKET)中的对象进行增删查操作。


下面是详细原理解释:


---


## 1. **整体结构**


```js

export default {

async fetch(request, env) { ... }

}

```

- 这是一个 Workers 的模块化写法,`fetch` 方法会在每个 HTTP 请求到来时被自动调用。

- `request` 是 HTTP 请求对象,`env` 是注入的环境变量(包括 R2 存储桶 MY_BUCKET)。


---


## 2. **路径和 key 的提取**


```js

const url = new URL(request.url);

const key = url.pathname.slice(1);

```

- 解析请求的 URL,获取 path 部分(比如 `/myfile.txt`)。

- 去掉前导 `/`,得到 key(如 `myfile.txt`),用作 R2 存储桶的对象名。


---


## 3. **根据 HTTP 方法分流操作**


### **PUT 方法:上传对象**

```js

await env.MY_BUCKET.put(key, request.body);

return new Response(`Put ${key} successfully!`);

```

- 把请求体(request.body,通常是文件或数据)存入 MY_BUCKET,key 为路径名。

- 返回成功响应。


---


### **GET 方法:下载对象**

```js

const object = await env.MY_BUCKET.get(key);


if (object === null) {

return new Response("Object Not Found", { status: 404 });

}


const headers = new Headers();

object.writeHttpMetadata(headers);

headers.set("etag", object.httpEtag);


return new Response(object.body, { headers });

```

- 尝试从 MY_BUCKET 读取 key 对应的对象。

- 如果对象不存在,返回 404。

- 如果存在:

- 创建响应头(包括对象的元信息和 etag)。

- 返回对象内容(object.body)和这些头部。


---


### **DELETE 方法:删除对象**

```js

await env.MY_BUCKET.delete(key);

return new Response("Deleted!");

```

- 删除 key 对应的存储对象。

- 返回成功响应。


---


### **其他方法:返回 405**

```js

return new Response("Method Not Allowed", {

status: 405,

headers: { Allow: "PUT, GET, DELETE" },

});

```

- 限定只允许 PUT、GET、DELETE,其他方法(如 POST、PATCH 等)返回 405 错误。


---


## 4. **用途场景举例**


- 可以作为一个简单的**对象存储网关**,让你的前端、移动端应用通过 HTTP API 存储和读取文件。

- 支持 RESTful 风格的操作:上传(PUT)、下载(GET)、删除(DELETE)。


---


## 5. **流程图(文字版,便于理解)**


```

收到 HTTP 请求

├─> 解析 URL 得到 key

├─> 判断 HTTP 方法

│ ├─ PUT → 存储对象到 MY_BUCKET

│ ├─ GET → 读取对象,返回内容或 404

│ ├─ DELETE → 删除对象

│ └─ 其他 → 返回 405

```


---


## 6. **相关背景知识**


- **Cloudflare R2** 是 Cloudflare 推出的 S3 兼容对象存储服务。

- 通过 `env.MY_BUCKET` 访问 Cloudflare Workers 绑定的 R2 存储桶,实现对象的存储和管理。


---


如果你想要了解如何部署、绑定 R2,或者对代码的某一部分有疑问,欢迎继续提问!

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言