概述
Supabase存储使存储和服务大文件变得简单.
文件
文件可以是任何类型的媒体文件。这包括图像、GIF和视频。由于文件的大小,最好将其存储在数据库之外。为了安全起见,HTML文件以纯文本形式返回。
文件夹
文件夹是组织文件的一种方式(就像在计算机上一样)。 组织文件没有正确或错误的方法。您可以将它们存储在适合项目的任何文件夹结构中。
存储桶
Bucket是文件和文件夹的不同容器。你可以把它们想象成“超级文件夹”。 通常,您会为不同的安全和访问规则创建不同的存储桶。例如,您可以将所有视频文件保存在"video" 桶中,并将个人资料图片保存在"avatar"桶中。
开始使用
这是一个快速指南,介绍了Supabase Storage的基本功能。查找完整的GitHub中的示例应用程序, 您可以自行部署。
文件、文件夹和Bucket名称必须遵循AWS对象密钥命名指南并避免使用任何其他字符。
创建一个存储桶
你可以使用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存储将元数据存储在存储架构中的 objects
和buckets
表中。为了允许对文件的读取访问,RLS策略必须允许用户 SELECT
objects
表,
并且为了上载新对象,RLS政策必须允许用户访问INSERT
到objects
表格等。不同API调用与所需数据库权限之间的映射记录在参见文档中。
存储的访问控制通过RLS策略映射到buckets
和objects
表上的CRUD操作。
助手
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 );
参考资源
- 在博客文章中阅读有关Suabase Storage的更多信息
- GitHu上的Supabase存储
- Swagger API文档
- 官方JavaScript和Dart文档
- 社区图书馆