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

文件

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

文件夹

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

存储桶

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

开始使用

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

创建一个存储桶

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

上传一个文件

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

下载文件

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

添加安全规则

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

共有桶和私有桶

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

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

对于公共存储桶,您可以在没有令牌或Authorization标头的情况下直接访问资产。 getPublicUrl 帮助方法返回资产的完整公共URL。 这将在内部调用/object/public/API端点。虽然访问公共存储桶中的对象不需要授权,但其他操作(如上载、从公共存储桶删除对象)也需要适当的access control 。 公共存储桶也往往具有[更好的性能](/docs/app/development_guide/storage/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调用与所需数据库权限之间的映射记录在参见文档中。

助手

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


storage.filename()

返回文件名.

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

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

'avatar.png'


storage.foldername()

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

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

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

[ 'public', 'subfolder' ]


storage.extension()

返回一个文件的扩展名.

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

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

'png'


策略样例

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

允许公众访问一个存储桶

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

允许登录用户访问存储桶

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

允许个人访问文件

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

参考资源