跳到主要内容

传统模式云存储

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:// fileIDBucket 内对象名,如 user-123/avatar.png
权限模型内置权限 + JSON 安全规则PostgreSQL RLS Policy
覆盖默认值upsert 默认 trueupsert 默认 false
图片转换download() / 签名 URL 支持 TransformOptions不支持
Bucket 管理不支持支持 createBucket / listBuckets
文件列表不支持支持 list()
流式下载不支持download().asStream()

详见:API 参考(PG 模式)

快速开始

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 方法

客户端入口

文件操作

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 = File | Blob | ArrayBuffer | ArrayBufferView | FormData | string;

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);
}

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);
}

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();
}

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);
}

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);
}

copy

复制文件到新位置。

copy(fromPath: string, toPath: string): Promise<{ data: { path: string }; error: null } | { data: null; error: StorageError }>

参数

fromPath
string

源路径。

toPath
string

目标路径。

返回

data
Object

返回数据

error
StorageError | null

错误信息。

示例

// 复制文件到新位置
const { data, error } = await app.storage
.from()
.copy("images/photo.jpg", "images/backup/photo.jpg");

if (error) {
console.error("复制失败:", error);
} else {
console.log("复制成功,新文件路径:", data.path);
}

createSignedUrl

创建文件临时访问链接。

createSignedUrl(
path: string,
expiresIn: number,
options?: { download?: string | boolean; transform?: TransformOptions }
): Promise<{ data: { signedUrl: string }; error: null } | { data: null; error: StorageError }>

参数

path
string

完整 fileID。

expiresIn
number

有效期,单位秒。

options
Object

下载和图片转换选项。

返回

data
Object

返回数据

error
StorageError | null

错误信息。

示例

// 创建 1 小时有效的临时链接
const { data, error } = await app.storage
.from()
.createSignedUrl("cloud://envId.xxx/images/photo.jpg", 3600);

if (error) {
console.error("创建失败:", error);
} else {
console.log("临时链接:", data.signedUrl);
// 可以直接使用这个链接访问文件
}

createSignedUrls

批量创建临时访问链接。

createSignedUrls(paths: string[], expiresIn: number): Promise<{ data, error }>

参数

paths
string[]

完整 fileID 数组。

expiresIn
number

有效期,单位秒。

返回

data
Array | null

签名链接结果数组。

error
StorageError | null

错误信息。

示例

// 批量创建多个文件的临时链接
const { data, error } = await app.storage
.from()
.createSignedUrls(
[
"cloud://envId.xxx/images/photo1.jpg",
"cloud://envId.xxx/images/photo2.jpg",
"cloud://envId.xxx/images/photo3.jpg",
],
3600
);

if (error) {
console.error("创建失败:", error);
} else {
data.forEach((item) => {
console.log(`${item.path}: ${item.signedUrl}`);
});
}

getPublicUrl

获取公开访问 URL。

getPublicUrl(path: string, options?: { download?: string | boolean; transform?: TransformOptions }): Promise<{ data: { publicUrl: string }; error: null } | { data: null; error: StorageError }>

参数

path
string

完整 fileID。

返回

data
Object

返回数据

示例

// 获取文件的公开访问链接
const { data } = await app.storage
.from()
.getPublicUrl("cloud://envId.xxx/images/photo.jpg");

console.log("公开链接:", data.publicUrl);
// 可以直接使用这个链接(如果文件设置为公开访问)

info

获取文件信息。

info(pathOrFileId: string): Promise<{ data: FileInfo; error: null } | { data: null; error: StorageError }>

参数

pathOrFileId
string

完整 fileID 或相对路径。

返回

data
FileInfo | null

文件信息。

error
StorageError | null

错误信息。

示例

// 获取文件详细信息
const { data, error } = await app.storage
.from()
.info("cloud://envId.xxx/images/photo.jpg");

if (error) {
console.error("获取失败:", error);
} else {
console.log("文件名:", data.name);
console.log("文件大小:", data.size, "字节");
console.log("创建时间:", data.created_at);
console.log("更新时间:", data.updated_at);
console.log("元数据:", data.metadata);
}

exists

检查文件是否存在。

exists(pathOrFileId: string): Promise<{ data: boolean; error: null } | { data: null; error: StorageError }>

参数

pathOrFileId
string

完整 fileID 或相对路径。

返回

data
boolean | null

是否存在。

error
StorageError | null

错误信息。

示例

// 检查文件是否存在
const { data: exists, error } = await app.storage
.from()
.exists("cloud://envId.xxx/images/photo.jpg");

if (error) {
console.error("检查失败:", error);
} else if (exists) {
console.log("文件存在");
} else {
console.log("文件不存在");
}

createSignedUploadUrl

创建上传签名 URL。

createSignedUploadUrl(path: string): Promise<{ data, error }>

参数

path
string

上传目标路径。

返回

data
Object | null

签名上传 URL 与 CloudBase 上传元信息。

error
StorageError | null

错误信息。

示例

// 创建用于上传的签名 URL
const { data, error } = await app.storage
.from()
.createSignedUploadUrl("cloud://envId.xxx/images/photo.jpg");

if (error) {
console.error("创建失败:", error);
} else {
console.log("上传 URL:", data.signedUrl);
console.log("上传令牌:", data.token);

// 使用这个 URL 直接上传文件
const formData = new FormData();
formData.append("file", file);

await fetch(data.signedUrl, {
method: "PUT",
body: file,
headers: {
"Content-Type": file.type,
},
});
}

类型定义

type Result<T> =
| { data: T; error: null }
| { data: null; error: StorageError };

type FileBody = File | Blob | ArrayBuffer | ArrayBufferView | FormData | string;

interface UploadResult {
id: string;
path: string;
fullPath: string;
}

interface FileOptions {
cacheControl?: string;
contentType?: string;
metadata?: Record<string, any>;
upsert?: boolean;
}

interface TransformOptions {
width?: number;
height?: number;
quality?: number;
format?: "jpg" | "png" | "webp";
}

迁移指南

如果你正在从 JS SDK v2 或旧版文件 API 迁移到 JS SDK v3 的传统模式云存储 API,可以按下表替换:

旧版 APIJS SDK v3 传统模式 API
app.uploadFile()app.storage.from().upload()
app.downloadFile()app.storage.from().download()
app.getTempFileURL()app.storage.from().createSignedUrl()
app.deleteFile()app.storage.from().remove()

迁移时建议保存 upload() 返回的完整 fileID,并在下载、删除、生成签名 URL、查询信息时使用该值。

最佳实践

1. 错误处理

const { data, error } = await app.storage.from().upload("images/photo.jpg", file);

if (error) {
console.error("操作失败:", error.message);
return;
}

2. 文件路径规范

  • 上传时传入云存储相对路径,例如 images/photo.jpg
  • 下载、删除、签名 URL 和文件信息查询建议使用上传返回的完整 fileID
  • 路径不要以 / 开头,不要包含连续 /

相关资源