前几天Supabase数据库因为存储了大量图片Base64字符串,导致空间不够了,但其实这个字段并没有什么用,所以我直接把字段删除算是暂时解决了问题,但是今天另一个站又遇到了一个新问题,它必须要存一些图片,如果还是像之前一样直接把Base64存起来的话,又会很容易导致容量不够,这时候我们就要用到Supabase的Storage了。
先来看下Table和Storage的区别:
Table一般是存储纯文字信息。比如用户账号(邮箱、名字)、商品信息(价格、库存)、订单记录等。而我们用SQL语句(增删改查)直接操作,比如用户表里存了用户ID和头像文件名,比如user_123_avatar.jpg,但图片本身不在这儿——表格只记名字,像图书目录。
而桶(Buckets)是Storage功能的一部分,像个云盘/U盘,适合放大文件,比如存储图片、视频、PDF等。比如用户上传头像时,我们把图片扔进叫avatars的桶里,拿到访问链接后,把链接地址存回表格的avatar_url字段。它们是怎么配合的呢?
用户上传头像图片 → 调用Storage API传到avatars桶
上传成功拿到公开URL → 更新users表里对应用户的avatar_url字段
页面上显示头像时 → 先查表格拿到URL,再用<img src="那个URL">显示
Storage还有两个核心功能:
分类管理,井井有条,你可以创建不同的分区,比如
'user-avatars' // 专门放用户头像
'product-images' // 专门放商品大图
'invoices' // 专门放生成的账单PDF
'blog-assets' // 专门放博客文章的配图
权限控制,安全放心
这是它的杀手级功能。可以精细控制谁能看、谁能改:
公开读:比如用户头像、商品图,谁都能看。
-- 让所有人能读 'avatars' 桶
create policy "任何人都可以查看头像"
on storage.objects for select
using ( bucket_id = 'avatars' );
私有读写:比如用户的私人文件,只有他自己能访问。
-- 只让用户操作自己的文件
create policy "用户只能操作自己的文件"
on storage.objects for all
using ( auth.uid() = owner );
所以文字信息、关系数据放在Table里,图片视频这些大文件放Storage里,这两个配合起来用基本就可以了。

