跳到主要内容

supabase_storage

简介

封装 Supabase Storage 的 API,提供文件上传、下载、删除、列举等功能。

组件接口

StorageFileApi

StorageFileApi

文件操作 API 封装

内部持有 StorageClient 客户端

负责将用户的文件操作请求转换为底层的 HTTP 指令

成员变量

变量名类型初始值须初始化描述
clientStorageClientnil可选StorageClient 客户端
bucket_idstringnil可选存储桶 ID

成员方法

函数原型函数作用
FileUploadResponse upload_or_update_file(string relative_path, mixed data, bool update, FileOptions option = nil)上传或更新文件,操作对象为存储桶
FileUploadResponse update_file(string relative_path, mixed data, FileOptions option = nil)更新文件,将替换指定路径下的现有文件
FileUploadResponse upload_file(string relative_path, mixed data, FileOptions option = nil)上传文件到指定路径的现有存储桶
MessageResponse move_file(string sourceKey, string destinationKey)移动文件,将现有文件移动到同一存储桶中的新路径
SignedUrlResponse create_signed_url(string file_path, int expires_in = 60)创建签名 URL,使用签名 URL 可以在固定时间内共享文件
SignedUrlResponse create_signed_upload_url(string file_path)创建用于上传文件的签名 URL,使用签名 URL 可以将文件直接上传到存储桶
UploadToSignedUrlResponse upload_to_signed_url(string file_path, mixed file_body)将文件上传到已签名的 URL
SignedUrlResponse get_public_url(string file_path, UrlOptions url_options)获取公共存储桶中资源的 URL
array remove_file(array paths)从现有存储桶中删除文件
array list_files(string query_path, FileSearchOptions options)列出现有存储桶中的文件
mixed download_file(string file_path, UrlOptions url_options, int content_type)从现有存储桶下载文件
string build_url_with_option(string url, UrlOptions options)基于当前 URL 和选项构建一个新 URL

HttpTransPort

TransPort

底层传输层:负责 HTTP 协议细节、URL 拼接、认证头注入、错误处理

成员变量

变量名类型初始值须初始化描述
base_urlstringnil可选
default_headersmapnil可选

成员方法

函数原型函数作用
mixed request(string method, string path, mixed body = nil, map headers = nil, int content_type = "Content_Type.json")执行底层 HTTP 请求

StorageClient

StorageClient

业务逻辑层:面向用户的 API 封装

负责将用户的业务请求转换为底层的 HTTP 指令

内部持有 HttpTransPort 实例来完成实际的网络通信

成员变量

变量名类型初始值须初始化描述
trans_portHttpTransPortnil可选底层传输层实例

成员方法

函数原型函数作用
mixed request(string method, string path, mixed body = nil, map headers = nil, int content_type = 2)发起 HTTP 请求
StorageFileApi from(string id)切换上下文到指定的存储桶,准备进行文件操作
array list_buckets()列出所有存储桶
map get_bucket(string id)获取指定存储桶详情
map create_bucket(string id, BucketOptions options)创建存储桶
map update_bucket(string id, BucketOptions options)更新存储桶
map empty_bucket(string id)清空存储桶
map delete_bucket(string id)删除存储桶

MessageResponse

消息响应类型

用于返回操作结果消息

成员变量

变量名类型初始值须初始化描述
messagestringnil可选消息内容

成员方法

函数原型函数作用

BucketResponseError

存储桶响应错误类型

用于表示存储桶操作失败时的错误信息

成员变量

变量名类型初始值须初始化描述
errorstringnil可选错误类型
messagestringnil可选错误消息
status_codeint0可选HTTP 状态码

成员方法

函数原型函数作用

Bucket

存储桶信息

表示 Supabase Storage 中的存储桶对象

成员变量

变量名类型初始值须初始化描述
idstringnil可选存储桶唯一标识符
namestringnil可选存储桶名称
ownerstringnil可选存储桶所有者
is_publicstringnil可选是否为公开存储桶(注意:API 可能返回 boolean,需要转换)
file_size_limitint0可选文件大小限制(字节),0 表示无限制
allowed_mime_typesarraynil可选允许的 MIME 类型列表,nil 表示允许所有类型
created_atstringnil可选创建时间
updated_atstringnil可选更新时间

成员方法

函数原型函数作用

BucketOptions

存储桶配置选项

用于创建或更新存储桶时的配置参数

成员变量

变量名类型初始值须初始化描述
is_publicboolfalse可选存储桶的可见性,true 为公开,false 为私有,默认为私有
file_size_limitstringnil可选存储桶中允许的最大文件大小(以字节为单位),nil 表示无限制
allowed_mime_typesarraynil可选允许的 MIME 类型列表,nil 表示允许所有 MIME 类型

成员方法

函数原型函数作用

SortBy

排序选项

用于指定文件列表的排序方式

成员变量

变量名类型初始值须初始化描述
columnstringnil可选排序列名,如 "name"、"created_at"、"updated_at" 等
orderstringnil可选排序顺序,"asc" 为升序,"desc" 为降序

成员方法

函数原型函数作用

FileUploadResponse

文件上传响应

表示文件上传操作的结果

成员变量

变量名类型初始值须初始化描述
Keystringnil可选文件路径/键名
Messagestringnil可选响应消息
Dataarraynil可选响应数据数组
Codestringnil可选响应代码
Errorstringnil可选错误信息(如果存在)

成员方法

函数原型函数作用

SignedUrlResponse

签名 URL 响应

包含用于访问或上传文件的签名 URL

成员变量

变量名类型初始值须初始化描述
signed_urlstringnil可选签名 URL,用于在固定时间内访问或上传文件

成员方法

函数原型函数作用

FileSearchOptions

文件搜索选项

用于配置文件列表查询的参数

成员变量

变量名类型初始值须初始化描述
limitint0可选返回文件数量限制,0 表示使用默认值
offsetint0可选分页偏移量,跳过前 N 条记录
sort_by_optionsSortBynil可选排序选项,nil 表示不排序

成员方法

函数原型函数作用

FileObject

文件对象

表示存储桶中的文件信息

成员变量

变量名类型初始值须初始化描述
namestringnil可选文件名
bucket_idstringnil可选所属存储桶 ID
ownerstringnil可选文件所有者
idstringnil可选文件唯一标识符
updated_atstringnil可选更新时间
created_atstringnil可选创建时间
last_accessed_atstringnil可选最后访问时间
metadatamixednil可选文件元数据(JSON 对象)
bucketsBucketnil可选所属存储桶信息

成员方法

函数原型函数作用

ListFileRequestBody

列出文件请求体

用于构建文件列表查询的请求参数

成员变量

变量名类型初始值须初始化描述
limitint0可选返回文件数量限制
offsetint0可选分页偏移量
sort_by_optionsSortBynil可选排序选项
prefixstringnil可选文件路径前缀,用于过滤特定路径下的文件

成员方法

函数原型函数作用

TransformOptions

图片转换选项

用于配置图片的尺寸、格式、质量等转换参数

成员变量

变量名类型初始值须初始化描述
widthint0可选图片宽度(像素),0 表示不限制
heightint0可选图片高度(像素),0 表示不限制
resizestringnil可选调整大小模式:"cover"(覆盖)、"contain"(包含)、"fill"(填充)
qualityint80可选图片质量(1-100),默认 80
formatstring"origin"可选图片格式:"origin"(原始)、"webp"、"avif" 等

成员方法

函数原型函数作用

UrlOptions

URL 选项

用于配置文件 URL 的转换和下载选项

成员变量

变量名类型初始值须初始化描述
transformTransformOptionsnil可选图片转换选项,nil 表示不转换
downloadboolfalse可选是否作为下载链接,true 时会在响应头中设置 Content-Disposition

成员方法

函数原型函数作用

SignedUploadUrlResponse

签名上传 URL 响应

包含用于上传文件的签名 URL

成员变量

变量名类型初始值须初始化描述
urlstringnil可选签名上传 URL

成员方法

函数原型函数作用

UploadToSignedUrlResponse

上传到签名 URL 的响应

表示通过签名 URL 上传文件后的结果

成员变量

变量名类型初始值须初始化描述
Keystringnil可选上传后的文件路径/键名

成员方法

函数原型函数作用

FileOptions

文件选项

用于配置文件上传时的各种选项

成员变量

变量名类型初始值须初始化描述
cache_controlstring"3600"可选资源在浏览器和 Supabase CDN 中缓存的秒数,在 Cache-Control: max-age=<seconds> 标头中设置,默认 3600 秒
content_typestring"text/plain;charset=UTF-8"可选Content-Type 标头值,如果 fileBody 不是 Blob/File/FormData,应指定此值,默认 text/plain;charset=UTF-8
duplexstringnil可选双工流选项,用于启用或禁用双工流(允许在同一流中同时读取和写入数据),nil 表示不设置
upsertboolnil可选是否覆盖已存在的文件,true 时覆盖,false 时抛出错误,nil 时不传递该选项(使用服务器默认值)

成员方法

函数原型函数作用

样例


public void pkg_sample()
{
string supabase_url = config.opt("supabase_url");
string supabase_service_key = config.opt("supabase_service_key");
string storage_url = config.opt("storage_url");

// 初始化存储客户端(默认使用 service key)
StorageClient client = StorageClient.new(supabase_url + storage_url, supabase_service_key);

// ------------------------ 桶操作相关的测试代码 ------------------------

// 测试列出所有存储桶
array bucket_list_result = client.list_buckets();
printf("Buckets: %O\n", bucket_list_result);

// 测试根据 ID 获取存储桶
map bucket_fetch_result = client.get_bucket("test2");
printf("Bucket: %O\n", bucket_fetch_result);

// 测试创建存储桶,访问模式为公开
BucketOptions bucket_create_options = BucketOptions.new(true);
map bucket_create_result = client.create_bucket("test2", bucket_create_options);
printf("Bucket: %O\n", bucket_create_result);

// 测试更新存储桶,访问模式为私有
BucketOptions bucket_update_options = BucketOptions.new(false);
map bucket_update_result = client.update_bucket("test2", bucket_update_options);
printf("Bucket: %O\n", bucket_update_result);
map bucket_update_fetch = client.get_bucket("test2");
printf("Bucket: %O\n", bucket_update_fetch);

// 测试清空存储桶
map bucket_empty_result = client.empty_bucket("test2");
printf("Empty bucket: %O\n", bucket_empty_result);

// 测试删除存储桶
map bucket_delete_result = client.delete_bucket("test2");
printf("Delete bucket: %O\n", bucket_delete_result);

// ------------------------ 上传文件(桶的内部操作)相关的测试代码 ------------------------

// 读取测试文件内容
string content = (string)(file.read_all("/src/data/dummy.txt", "b"));

// 测试上传文件,选择对test1桶进行操作
StorageFileApi file_api = client.from("test1");
FileUploadResponse upload_result = file_api.upload_file("444.txt", content);
printf("Upload file: %O\n", upload_result);

// 测试更新文件
FileUploadResponse update_result = file_api.update_file("222.txt", content);
printf("Update file: %O\n", update_result);

// 测试移动文件
MessageResponse move_result = file_api.move_file("hhh.txt", "ttt/test2.txt");
printf("Move file: %O\n", move_result);

// 测试删除文件
array delete_result = file_api.remove_file(["444.txt", "333.txt"]);
printf("Delete file: %O\n", delete_result);

// 测试创建签名 URL
SignedUrlResponse signed_url_result = file_api.create_signed_url("ttt/test2.txt", 300);
printf("Signed URL: %O\n", signed_url_result);

// 测试获取公共 URL
UrlOptions public_url_options = UrlOptions.new(TransformOptions.new());
map public_url_result = file_api.get_public_url("test.txt", public_url_options);
printf("Public URL: %O\n", public_url_result);

// 测试列出文件
SortBy sort_by = SortBy.new();
FileSearchOptions list_options = FileSearchOptions.new(sort_by, 0, 1);
array list_result = file_api.list_files("", list_options);
printf("List files: %O\n", list_result);

// 测试创建上传签名 URL 并上传文件
SignedUrlResponse upload_signed_result = file_api.create_signed_upload_url("hhh.txt");
printf("Signed URL: %O\n", upload_signed_result);
UploadToSignedUrlResponse upload_to_signed_result = file_api.upload_to_signed_url(
upload_signed_result.signed_url,
content
);
printf("Upload to signed URL: %O\n", upload_to_signed_result);

// 测试下载文件
UrlOptions download_options = UrlOptions.new(TransformOptions.new());
mixed download_result = file_api.download_file("4.jpg", download_options, 0);
file fw = file.open("4.jpg", "w");
fw.write(download_result);
fw.close();
}