跳到主要内容
Void

对象存储

用 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);
目录