Skip to main content

Scalable File Storage with CanDB

Implement decentralized file storage and management on the Internet Computer using CanDB, including standards for metadata and chunking.

Scalable File Storage with CanDB

Standards

filemetadata#<sha256> filechunk#<sha256>#<chunkid>

		// routing.services.ts
export async function putFile(
	serviceClient: ActorClient<IndexCanister, AppService | UserService>,
	pk: string, // app
	sha256: string, // d626b6fc8303502056664d2ad9af32581ddd5fbf902d794890e7790f4e87c3a7
	inFile: FileWithChunks, // { metadata: { name: string, size: bigint, type: string }, chunks: Uint8Array[] }
) {
	let fileSk: string = `filemetadata#${sk}`;
	await serviceClient.update<any['putObject']>(pk, fileSk, (actor: any) =>
		actor.putObject(fileSk, { filemetadata: inFile.metadata })
	);
	// put file chunks
	for (let [index, val] of inFile.chunks.entries()) {
		let chunkSk = `filechunk#${sk}#${pack(index, 'hex')}`;
		let chunkArray = [...new Uint8Array(val)];
		await serviceClient.update<any['putObject']>(pk, chunkSk, (actor: any) =>
			actor.putObject(chunkSk, { filechunk: chunkArray })
		);
	}
}