Skip to main content

PG Cloud Storage

CloudBase JS SDK v3 PG mode provides PostgreSQL-native bucket-based cloud storage capabilities. Use app.storage.from(bucketId) to get the object client for a specific bucket. All path parameters are object names inside the bucket; do not pass cloud:// fileIDs.

Quick Start

import cloudbase from "@cloudbase/js-sdk";

const app = cloudbase.init({ env: "your-env-id" });
const bucket = app.storage.from("avatars");

const { data, error } = await bucket.upload("user-123/avatar.png", file, {
contentType: "image/png",
upsert: true,
});
if (error) throw error;

const { data: blob } = await bucket.download("user-123/avatar.png");
const { data: signed } = await bucket.createSignedUrl("user-123/avatar.png", 3600);
await bucket.remove(["user-123/avatar.png"]);

API Methods

Bucket Client

File Operations

URL Management

File Information

  • info() - Get file information
  • exists() - Check whether a file exists

Bucket Management


from

from(bucketId: string): PostgresNativeStorageFileApi

type PostgresNativeStorageFileApi = StorageFileApi;

Parameters

bucketId
string

PG Bucket ID, corresponding to `storage.buckets.id`.

Response

PostgresNativeStorageFileApi
Object

Native PG bucket object operation client.

Example

const bucket = app.storage.from("avatars");

throwOnError

throwOnError(): this

Parameters

No parameters

Response

this
PostgresNativeStorageFileApi

Current client instance for chaining.

Example

const bucket = app.storage.from("avatars").throwOnError();
await bucket.upload("user-123/avatar.png", file);

upload

Upload a file to storage.

upload(path: string, fileBody: FileBody, fileOptions?: UploadOptions): Promise<Result<UploadResult>>

type FileBody = File | Blob | ArrayBuffer | ArrayBufferView | FormData | ReadableStream<Uint8Array> | string;

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

interface UploadOptions {
cacheControl?: string;
contentType?: string;
metadata?: Record<string, any>;
upsert?: boolean; // default false
}

interface UploadResult {
id: string;
path: string;
fullPath: string; // bucketId/objectName
}

Parameters

path
string

Object name inside the bucket, for example `user-123/avatar.png`. Do not pass `cloud://` fileIDs.

fileBody
FileBody

File content.

fileOptions
UploadOptions

Upload options. Pass `upsert: true` to overwrite existing objects.

Response

data
Object

Return data

error
StorageError | null

Error.

Example

const { data, error } = await app.storage.from("avatars").upload("user-123/avatar.png", file, {
contentType: "image/png",
upsert: true,
metadata: { usage: "avatar" },
});

if (error) throw error;
console.log(data.fullPath);

update

Update an existing file.

update(path: string, fileBody: FileBody, fileOptions?: UploadOptions): Promise<Result<UploadResult>>

interface UploadOptions {
cacheControl?: string;
contentType?: string;
metadata?: Record<string, any>;
}

Parameters

path
string

Object name inside the bucket.

fileBody
FileBody

New file content.

fileOptions
UploadOptions

Upload options.

Response

data
UploadResult | null

Update result.

error
StorageError | null

Error.

Example

await app.storage.from("avatars").update("user-123/avatar.png", newFile, {
contentType: "image/png",
});

download

Download a file.

download(path: string, options?: DownloadOptions, parameters?: FetchParameters): DownloadBuilder

interface DownloadOptions {
download?: string | boolean;
cacheNonce?: string;
}

interface FetchParameters {
signal?: AbortSignal;
cache?: RequestCache;
}

Parameters

path
string

Object name inside the bucket.

options
DownloadOptions

Download options.

parameters
FetchParameters

Request control parameters.

Response

data
Blob | ReadableStream | null

Await returns Blob by default. `.asStream()` returns ReadableStream.

error
StorageError | null

Error.

Example

const { data: blob } = await app.storage.from("avatars").download("user-123/avatar.png");

const { data: stream } = await app.storage
.from("videos")
.download("demo.mp4")
.asStream();

remove

Delete one or more files.

remove(paths: string[]): Promise<Result<FullObject[]>>

interface FullObject {
name: string;
bucket_id: string;
owner_id?: string | null;
metadata?: Record<string, any>;
}

Parameters

paths
string[]

Object names inside the bucket.

Response

data
FullObject[] | null

Deleted object information.

error
StorageError | null

Error.

Example

await app.storage.from("avatars").remove(["user-123/avatar.png"]);

move

Move a file to a new path.

move(fromPath: string, toPath: string, options?: DestinationOptions): Promise<Result<{ message: string }>>

interface DestinationOptions {
destinationBucket?: string;
upsert?: boolean;
}

Parameters

fromPath
string

Source object name.

toPath
string

Destination object name.

options
DestinationOptions

Destination bucket options.

Response

data
Object

Return data

error
StorageError | null

Error.

Example

await app.storage.from("avatars").move("user-123/avatar.png", "user-123/archive/avatar.png");

copy

Copy a file to a new path.

copy(fromPath: string, toPath: string, options?: DestinationOptions): Promise<Result<{ path: string }>>

interface DestinationOptions {
destinationBucket?: string;
upsert?: boolean;
copyMetadata?: boolean;
metadata?: Record<string, any>;
}

Parameters

fromPath
string

Source object name.

toPath
string

Destination object name.

options
DestinationOptions

Cross-bucket and metadata options.

Response

data
Object

Return data

error
StorageError | null

Error.

Example

await app.storage.from("avatars").copy("user-123/avatar.png", "user-123/avatar-copy.png", {
upsert: true,
copyMetadata: true,
});

createSignedUrl

Create a temporary access URL.

createSignedUrl(path: string, expiresIn: number, options?: SignedUrlOptions): Promise<Result<SignedUrlResult>>

interface SignedUrlOptions {
download?: string | boolean;
cacheNonce?: string;
}

interface SignedUrlResult {
fullSignedURL: string;
}

Parameters

path
string

Object name inside the bucket.

expiresIn
number

Expiration in seconds.

options
SignedUrlOptions

Signed URL options.

Response

data
Object

Return data

error
StorageError | null

Error.

Example

const { data } = await app.storage.from("avatars").createSignedUrl("user-123/avatar.png", 3600, {
download: "avatar.png",
});

createSignedUrls

Create temporary access URLs in batch.

createSignedUrls(paths: string[], expiresIn: number, options?: SignedUrlOptions): Promise<Result<SignedUrlsResultItem[]>>

interface SignedUrlsResultItem {
path: string;
fullSignedURL: string | null;
error: string | null;
}

Parameters

paths
string[]

Object names inside the bucket.

expiresIn
number

Expiration in seconds.

options
SignedUrlOptions

Signed URL options.

Response

data
SignedUrlsResultItem[] | null

Batch signing results.

error
StorageError | null

Error.

Example

await app.storage.from("avatars").createSignedUrls(["user-123/avatar.png"], 3600);

getPublicUrl

Get a public access URL.

getPublicUrl(path: string, options?: PublicUrlOptions): { data: { publicUrl: string } }

interface PublicUrlOptions {
download?: string | boolean;
cacheNonce?: string;
}

Parameters

path
string

Object name inside the bucket.

options
PublicUrlOptions

Public URL options.

Response

data
Object

Return data

Example

const { data } = app.storage.from("public-assets").getPublicUrl("logos/cloudbase.png");

info

Get file information.

info(path: string): Promise<Result<ObjectInfo>>

interface ObjectInfo {
id: string;
name: string;
bucketId: string;
size?: number | null;
contentType?: string | null;
metadata?: Record<string, any>;
createdAt?: string | null;
}

Parameters

path
string

Object name inside the bucket.

Response

data
ObjectInfo | null

Object metadata.

error
StorageError | null

Error.

Example

await app.storage.from("avatars").info("user-123/avatar.png");

exists

Check whether a file exists.

exists(path: string): Promise<Result<boolean>>

Parameters

path
string

Object name inside the bucket.

Response

data
boolean | null

Whether it exists.

error
StorageError | null

Error.

Example

await app.storage.from("avatars").exists("user-123/avatar.png");

createSignedUploadUrl

Create a signed upload URL.

createSignedUploadUrl(path: string, options?: { upsert?: boolean }): Promise<Result<CreateSignedUploadUrlResult>>

interface CreateSignedUploadUrlResult {
fullSignedURL: string;
token: string;
path: string;
}

Parameters

path
string

Object name inside the bucket.

options
{ upsert?: boolean }

Whether to allow overwrite.

Response

data
CreateSignedUploadUrlResult | null

Signed upload URL and token.

error
StorageError | null

Error.

Example

const bucket = app.storage.from("avatars");
const { data: signed } = await bucket.createSignedUploadUrl("user-123/avatar.png", { upsert: true });
await bucket.uploadToSignedUrl("user-123/avatar.png", signed.token, file);

list

List objects in a bucket.

list(path?: string, options?: ListOptions, parameters?: FetchParameters): Promise<Result<ListObjectsResponse>>

interface ListOptions {
limit?: number;
cursor?: string;
withDelimiter?: boolean;
sortBy?: { column?: "name" | "created_at" | "updated_at"; order?: "asc" | "desc" };
}

Parameters

path
string

Prefix. Omit it to list the bucket root.

options
ListOptions

List options.

Response

data
ListObjectsResponse | null

Contains folders, objects, hasNext, and nextCursor.

error
StorageError | null

Error.

Example

const { data } = await app.storage.from("avatars").list("user-123", {
limit: 20,
withDelimiter: true,
});

Bucket management

The following APIs are mounted directly on app.storage and are only available in PG mode:

listBuckets(options?: ListBucketOptions): Promise<Result<Bucket[]>>
getBucket(bucketId: string): Promise<Result<Bucket>>
createBucket(bucketId: string, options?: CreateBucketOptions): Promise<Result<{ name: string }>>
updateBucket(bucketId: string, options: UpdateBucketOptions): Promise<Result<{ message: string }>>
deleteBucket(bucketId: string): Promise<Result<{ message: string }>>

interface CreateBucketOptions {
public?: boolean;
type?: "STANDARD";
fileSizeLimit?: number | string | null;
allowedMimeTypes?: string[] | null;
}

Parameters

bucketId
string

Bucket ID.

options
Object

Bucket configuration.

Response

data
Bucket | Bucket[] | Object | null

Bucket operation result.

Example

await app.storage.createBucket("avatars", {
public: false,
type: "STANDARD",
fileSizeLimit: "100MB",
allowedMimeTypes: ["image/png", "image/jpeg"],
});

const { data: buckets } = await app.storage.listBuckets({ limit: 20, offset: 0 });


Best Practices

1. Error handling

const { data, error } = await app.storage.from("avatars").upload("user-123/avatar.png", file);

if (error) {
console.error("Operation failed:", error.message);
return;
}

2. Path rules

  • Select a bucket with from(bucketId) first. All subsequent paths are object names inside that bucket.
  • Do not pass cloud:// fileIDs.
  • Do not start paths with / or include consecutive /.

FAQ

1. Why should I not pass cloud:// fileIDs in PG mode?

The native PG API already selects the bucket through from(bucketId). Method path arguments are object names inside that bucket.

2. Where are file permissions configured?

PG mode is controlled by RLS policies on storage.objects / storage.buckets.

Related Resources