Skip to content

Firebase Storage

firekitDownloadUrl resolves the public download URL for a Storage path and keeps it reactive.

<script lang="ts">
import { firekitDownloadUrl } from 'svelte-firekit';
const avatar = firekitDownloadUrl('images/user-avatars/uid-123.jpg');
</script>
{#if avatar.loading}
<div class="avatar-placeholder" />
{:else if avatar.url}
<img src={avatar.url} alt="User avatar" />
{/if}
PropertyTypeDescription
urlstring | nullDownload URL once resolved
loadingbooleantrue while resolving
errorError | nullSet if the URL cannot be resolved

firekitUploadTask starts a resumable upload and exposes reactive progress state.

<script lang="ts">
import { firekitUploadTask } from 'svelte-firekit';
let file = $state<File | null>(null);
let upload = $derived(
file ? firekitUploadTask(`uploads/${file.name}`, file) : null
);
</script>
<input type="file" onchange={(e) => (file = e.currentTarget.files?.[0] ?? null)} />
{#if upload}
<progress value={upload.progress} max={100} />
<p>{upload.state}</p>
{#if upload.downloadURL}
<a href={upload.downloadURL}>View file</a>
{/if}
{#if upload.error}
<p class="error">{upload.error.message}</p>
{/if}
<button onclick={() => upload?.pause()}>Pause</button>
<button onclick={() => upload?.resume()}>Resume</button>
<button onclick={() => upload?.cancel()}>Cancel</button>
{/if}
PropertyTypeDescription
progressnumberUpload progress 0–100
stateUploadState'running' | 'paused' | 'success' | 'error' | 'canceled'
downloadURLstring | nullAvailable once upload completes successfully
errorError | nullSet if the upload fails
bytesTransferrednumberBytes transferred so far
totalBytesnumberTotal file size in bytes
const upload = firekitUploadTask('uploads/file.jpg', file, {
contentType: 'image/jpeg',
customMetadata: { uploadedBy: uid },
});

firekitStorageList lists all items (files) and prefixes (sub-directories) under a Storage path.

<script lang="ts">
import { firekitStorageList } from 'svelte-firekit';
const dir = firekitStorageList('uploads/2024');
</script>
{#if dir.loading}
<p>Loading…</p>
{:else}
<h3>Files</h3>
{#each dir.items as item}
<p>{item.name}{item.fullPath}</p>
{/each}
<h3>Sub-directories</h3>
{#each dir.prefixes as prefix}
<p>{prefix.name}</p>
{/each}
{/if}
import { deleteFile, getFileMetadata, updateFileMetadata } from 'svelte-firekit';
// Delete a file
await deleteFile('images/old-avatar.jpg');
// Read metadata
const meta = await getFileMetadata('images/avatar.jpg');
console.log(meta.size, meta.contentType, meta.timeCreated);
// Update metadata
await updateFileMetadata('images/avatar.jpg', {
contentType: 'image/webp',
customMetadata: { uploadedBy: uid, processed: 'true' },
});
<script lang="ts">
import { DownloadURL } from 'svelte-firekit';
</script>
<DownloadURL path="images/avatar.jpg">
{#snippet data(url)}
<img src={url} alt="Avatar" />
{/snippet}
{#snippet loading()}
<div class="skeleton" />
{/snippet}
</DownloadURL>
<script lang="ts">
import { UploadTask } from 'svelte-firekit';
let file: File;
</script>
<UploadTask path={`uploads/${file?.name}`} {file}>
{#snippet data({ progress, state, downloadURL })}
<progress value={progress} max={100} />
{#if downloadURL}<a href={downloadURL}>Download</a>{/if}
{/snippet}
</UploadTask>