对象存储
用 void/storage 的 storage 把文件存入 Cloudflare R2,获得带类型的上传、下载与元数据 API。
预计阅读 1 分钟
基本操作
import { storage } from 'void/storage';
// 上传
await storage.put('uploads/photo.jpg', file, {
httpMetadata: { contentType: 'image/jpeg' },
});
// 下载
const object = await storage.get('uploads/photo.jpg');
if (object) {
const data = await object.arrayBuffer();
}
// 删除
await storage.delete('uploads/photo.jpg');
// 列举
const listed = await storage.list({ prefix: 'uploads/' });
for (const obj of listed.objects) {
console.log(obj.key, obj.size);
}
// 仅元数据
const head = await storage.head('uploads/photo.jpg');
storage 支持完整的 R2Bucket API。
分发文件
一个常见模式是通过 API 路由分发上传的文件:
import { defineHandler } from 'void';
import { storage } from 'void/storage';
export const GET = defineHandler(async (c) => {
const object = await storage.get(`uploads/${c.req.param('key')}`);
if (!object) {
return c.notFound();
}
const headers = new Headers();
object.writeHttpMetadata(headers);
headers.set('etag', object.httpEtag);
// 不要让用户上传的 HTML 或 SVG 在你的站点上作为页面执行。
headers.set('X-Content-Type-Options', 'nosniff');
headers.set('Content-Disposition', 'attachment');
return new Response(object.body, { headers });
});
自定义绑定
用 createStorage(bucket) 接入你自己的 R2 绑定,或在测试中使用:
import { createStorage } from 'void/storage';
const storage = createStorage(env.MY_BUCKET);