存储

Supabase存储使存储和服务大文件变得简单.

文件

文件可以是任何类型的媒体文件。这包括图像、GIF和视频。由于文件的大小,最好将其存储在数据库之外。为了安全起见,HTML文件以纯文本形式返回。

文件夹

文件夹是组织文件的一种方式(就像在计算机上一样)。 组织文件没有正确或错误的方法。您可以将它们存储在适合项目的任何文件夹结构中。

存储桶

Bucket是文件和文件夹的不同容器。你可以把它们想象成“超级文件夹”。 通常,您会为不同的安全和访问规则创建不同的存储桶。例如,您可以将所有视频文件保存在"video" 桶中,并将个人资料图片保存在"avatar"桶中。

开始使用

这是一个快速指南,介绍了Supabase Storage的基本功能。查找完整的GitHub中的示例应用程序, 您可以自行部署。

Deploy with Vercel

note

文件、文件夹和Bucket名称必须遵循AWS对象密钥命名指南并避免使用任何其他字符。

创建一个存储桶

你可以使用Supabase仪表板创建一个存储桶。 由于存储可与Postgres数据库互操作,您还可以使用SQL或我们的客户端库。这里我们创建一个叫做 "avatars "的桶。

1.进入存储页面。

2.单击新建Bucket并输入Bucket的名称。

3.单击创建Bucket

上传一个文件

你可以从仪表板上传文件,或在浏览器中使用我们的JS库上传文件.

1.进入存储页面。

2.选择要上传文件的存储桶。

3.单击上传文件

4.选择你期望上传的文件,等待文件上传完成。

下载文件

您可以从仪表盘下载文件,或使用我们的JS库在浏览器中下载文件.

1.进入存储页面。

2.选择包含待下载文件的存储桶。

3.选择要下载的文件。

4.单击*下载

添加安全规则

要限制对文件的访问,可以使用仪表板或SQL.

1.进入存储页面。

2.单击侧边栏中的策略

3.单击“对象”表中的添加策略,为文件添加策略。您还可以为Buckets创建策略。

4.选择要将策略应用于下载(SELECT)、上载(INSERT)、更新(UPDATE)还是删除(DELETE)。

5.为您的策略指定一个唯一的名称。

6.使用SQL编写策略。

共有桶和私有桶

默认情况下,存储桶是私有的。

对于私有存储桶,您可以通过下载 方法访问对象。这对应于/object/auth/API端点。 或者,您可以使用 createSignedUrl方法创建一个具有到期日期的公共共享URL,它调用/object/sign/API。

对于公共存储桶,您可以在没有令牌或Authorization标头的情况下直接访问资产。 getPublicUrl 帮助方法返回资产的完整公共URL。 这将在内部调用/object/public/API端点。虽然访问公共存储桶中的对象不需要授权,但其他操作(如上载、从公共存储桶删除对象)也需要适当的access control 。 公共存储桶也往往具有[更好的性能](/docs/guides/storage cdn#Public与private存储桶)。

高级:反向代理

返回的URL通过API代理进行代理。它们的前缀是

/storage/v1
.

例如,在托管平台上是

https://[project_ref].supabase.co/storage/v1/object/public/[id]

您可以使用同一端点直接访问存储API。参见 API文档了解可用操作的完整列表。


访问控制

Supabase存储与Postgres数据库集成。

这意味着您可以使用相同的行级别安全策略用于管理对文件的访问。Supabase存储将元数据存储在存储架构中的 objectsbuckets 表中。为了允许对文件的读取访问,RLS策略必须允许用户 SELECT objects表, 并且为了上载新对象,RLS政策必须允许用户访问INSERTobjects 表格等。不同API调用与所需数据库权限之间的映射记录在参见文档中。

note

存储的访问控制通过RLS策略映射到bucketsobjects表上的CRUD操作。

助手

Supabase存储提供了SQL辅助功能,你可以在你的数据库查询和策略中使用这些功能.


storage.filename()

返回文件名.

1select storage.filename(name)
2from storage.objects;

例如,如果文件存储在public/subfolder/avatar.png中。它将返回:

'avatar.png'


storage.foldername()

返回一个数组路径,其中包含文件所属的所有子文件夹。

1select storage.foldername(name)
2from storage.objects;

例如,如果你的文件存储在 public/subfolder/avatar.png,它将返回:

[ 'public', 'subfolder' ]


storage.extension()

返回一个文件的扩展名.

1select storage.extension(name)
2from storage.objects;

例如,如果你的文件存储在 public/subfolder/avatar.png,它将返回:

'png'


策略样例

下面是一些存储策略的示例.

允许公众访问一个存储桶

1-- 1. Allow public access to any files in the "public" bucket
2create policy "Public Access"
3on storage.objects for select
4using ( bucket_id = 'public' );

允许登录用户访问存储桶

1-- 1. Allow logged-in access to any files in the "restricted" bucket
2create policy "Restricted Access"
3on storage.objects for select
4using (
5  bucket_id = 'restricted'
6  and auth.role() = 'authenticated'
7);

允许个人访问文件

1-- 1. Allow a user to access their own files
2create policy "Individual user Access"
3on storage.objects for select
4using ( auth.uid() = owner );

参考资源