传统模式云存储
CloudBase JS SDK v3 在传统模式下通过 app.storage.from() 提供云存储文件操作能力。传统模式面向环境内置云存储,上传时传入云存储相对路径,上传成功后返回完整 fileID;下载、删除、签名 URL、文件信息查询等操作建议使用完整 fileID。
提示
传统模式调用云存储相关 API 时,使用的是 云存储 HTTP API 的开放能力。在使用前,请前往 云开发平台/身份认证/权限控制 确认 StoragesHttpApiAllow 的策略管理配置是否符合预期。详细说明请参考 策略管理说明文档。
与 PG 模式云存储的差异
传统模式与 PG 模式 API 的关键差异:
| 维度 | 传统模式 | PG 模式 |
|---|---|---|
| 入口 | app.storage.from() | app.storage.from("bucketId") |
| 路径参数 | cloud:// fileID | Bucket 内对象名,如 user-123/avatar.png |
| 权限模型 | 内置权限 + JSON 安全规则 | PostgreSQL RLS Policy |
| 覆盖默认值 | upsert 默认 true | upsert 默认 false |
| 图片转换 | download() / 签名 URL 支持 TransformOptions | 不支持 |
| 签名 URL 过期时间 | 支持 expiresIn / maxAge(小于 1 拒绝,大于 3600 警告后仍下发) | 支持 expiresIn |
| Bucket 管理 | 不支持 | 支持 createBucket / listBuckets 等 |
| 文件列表 | 不支持 | 支持 list() |
| 流式下载 | 不支持 | download().asStream() |
快速开始
import cloudbase from "@cloudbase/js-sdk";
const app = cloudbase.init({ env: "your-env-id" });
const storage = app.storage.from();
const { data, error } = await storage.upload("images/photo.jpg", file);
if (error) throw error;
const fileID = data.id;
const { data: blob } = await storage.download(fileID);
const { data: signed } = await storage.createSignedUrl(fileID, 3600);
await storage.remove([fileID]);
API 方法
客户端入口
- from() - 获取传统模式云存储文件操作客户端
- throwOnError() - 错误时抛出异常
文件操作
URL 管理
- createSignedUrl() - 创建签名 URL
- createSignedUrls() - 批量创建签名 URL
- getPublicUrl() - 获取公开 URL
- createSignedUploadUrl() - 创建上传签名 URL
文件信息
from
from(): ClassicStorageFileApi
参数
无参数
返回
ClassicStorageFileApi
Object
传统模式 / 传统兼容对象操作客户端。
示例
const storage = app.storage.from();
throwOnError
throwOnError(): this
参数
无参数
返回
this
ClassicStorageFileApi
当前客户端实例,支持链式调用。
示例
const storage = app.storage.from().throwOnError();
await storage.upload("file.txt", file);
upload
上传文件到云存储。
upload(
path: string,
fileBody: FileBody,
fileOptions?: FileOptions
): Promise<
| { data: { id: string; path: string; fullPath: string }; error: null }
| { data: null; error: StorageError }
>
type FileBody = Blob | ArrayBuffer | ArrayBufferView | Uint8Array | string | { size?: number; byteLength?: number; [key: string]: any };
interface FileOptions {
cacheControl?: string;
contentType?: string;
metadata?: Record<string, any>;
upsert?: boolean; // 默认 true
}
参数
path
string
云存储相对路径,如 `images/photo.jpg`。
fileBody
FileBody
文件内容。
fileOptions
FileOptions
上传选项。传统模式默认 `upsert: true`。
返回
data
Object
返回数据
error
StorageError | null
错误信息。
示例
- 基础上传
- 带选项上传
// 上传文件
const { data, error } = await app.storage
.from()
.upload("images/photo.jpg", file);
if (error) {
console.error("上传失败:", error);
} else {
console.log("上传成功:", data);
console.log("文件 ID:", data.id);
console.log("文件路径:", data.path);
}
// 上传文件并设置选项
const { data, error } = await app.storage
.from()
.upload("images/photo.jpg", file, {
cacheControl: "max-age=3600",
contentType: "image/jpeg",
metadata: {
author: "John Doe",
uploadedAt: new Date().toISOString(),
},
});
if (error) {
console.error("上传失败:", error);
} else {
console.log("上传成功:", data);
}
update
更新已存在的文件。
update(path: string, fileBody: FileBody, fileOptions?: FileOptions): Promise<{ data, error }>
参数
path
string
云存储相对路径。
fileBody
FileBody
新的文件内容。
fileOptions
FileOptions
上传选项。
返回
data
{ id; path; fullPath } | null
更新结果。
error
StorageError | null
错误信息。
示例
- 更新文件
- 更新并修改元数据
// 更新文件内容
const { data, error } = await app.storage
.from()
.update("images/photo.jpg", newFile);
if (error) {
console.error("更新失败:", error);
} else {
console.log("更新成功:", data);
}
// 更新文件并修改元数据
const { data, error } = await app.storage
.from()
.update("images/photo.jpg", newFile, {
cacheControl: "max-age=7200",
metadata: {
updatedAt: new Date().toISOString(),
version: "2.0",
},
});
if (error) {
console.error("更新失败:", error);
} else {
console.log("文件已更新:", data.path);
}
download
下载文件并返回内容。
download(
fileId: string,
options?: TransformOptions
): Promise<{ data: Blob; error: null } | { data: null; error: StorageError }>
interface TransformOptions {
width?: number;
height?: number;
quality?: number;
format?: "jpg" | "png" | "webp";
}
参数
fileId
string
完整 CloudBase fileID。
options
TransformOptions
图片转换选项。
返回
data
Blob | null
文件内容。
error
StorageError | null
错误信息。
示例
- 下载文件
- 下载缩略图
- 转换格式
// 下载原始文件
const { data, error } = await app.storage
.from()
.download("cloud://envId.xxx/images/photo.jpg");
if (data) {
// 创建下载链接
const url = URL.createObjectURL(data);
const a = document.createElement("a");
a.href = url;
a.download = "photo.jpg";
a.click();
}
// 下载并转换图片为缩略图
const { data: thumbnail, error } = await app.storage
.from()
.download("cloud://envId.xxx/images/photo.jpg", {
width: 300,
height: 200,
quality: 80,
});
if (thumbnail) {
// 显示缩略图
const url = URL.createObjectURL(thumbnail);
document.getElementById("thumbnail").src = url;
}
// 下载并转换图片格式
const { data: webpImage, error } = await app.storage
.from()
.download("cloud://envId.xxx/images/photo.jpg", {
format: "webp",
quality: 90,
});
if (webpImage) {
console.log("已转换为 WebP 格式");
}
remove
删除一个或多个文件。
remove(paths: string[]): Promise<{ data: FileObject[]; error: null } | { data: null; error: StorageError }>
参数
paths
string[]
完整 fileID 数组。
返回
data
FileObject[] | null
删除结果。
error
StorageError | null
错误信息。
示例
- 删除单个文件
- 批量删除
// 删除单个文件
const { data, error } = await app.storage
.from()
.remove(["cloud://envId.xxx/images/photo.jpg"]);
if (error) {
console.error("删除失败:", error);
} else {
console.log("删除成功:", data);
}
// 批量删除多个文件
const { data, error } = await app.storage
.from()
.remove([
"cloud://envId.xxx/images/photo1.jpg",
"cloud://envId.xxx/images/photo2.jpg",
"cloud://envId.xxx/documents/file.pdf",
]);
if (error) {
console.error("删除失败:", error);
} else {
console.log(`成功删除 ${data.length} 个文件`);
}
move
移动文件到新位置。
move(fromPath: string, toPath: string): Promise<{ data: { message: string }; error: null } | { data: null; error: StorageError }>
参数
fromPath
string
源路径。
toPath
string
目标路径。
返回
data
Object
返回数据
error
StorageError | null
错误 信息。
示例
- 移动文件
- 重命名文件
// 移动文件到新位置
const { data, error } = await app.storage
.from()
.move("images/old-photo.jpg", "images/archive/photo.jpg");
if (error) {
console.error("移动失败:", error);
} else {
console.log("移动成功:", data.message);
}
// 重命名文件(移动到同一目录下的新名称)
const { data, error } = await app.storage
.from()
.move("images/photo.jpg", "images/new-photo.jpg");
if (error) {
console.error("重命名失败:", error);
} else {
console.log("重命名成功");
}
copy
复制文件到新位置。
copy(fromPath: string, toPath: string): Promise<{ data: { path: string }; error: null } | { data: null; error: StorageError }>
参数
fromPath
string
源路径。
toPath
string
目标路径。
返回
data
Object
返回数据