Skip to main content

File Uploads

Honocube provides a seamless way to handle file uploads by integrating storage providers directly into the resource lifecycle.

Storage Configuration​

First, define a storage provider in createApp.

export const { defineResource } = createApp({
// ...
storage: {
upload: async (file, options) => {
// Implement your upload logic (e.g., S3, Cloudflare R2, Local)
// Return the public path or key of the file
const key = `${options.folder}/${Date.now()}_${options.name}`;
await myS3Client.put(key, file);
return key;
},
},
// Base URL for resolving media paths in responses
mediaBaseUrl: "https://cdn.example.com/",
});

Defining Upload Fields​

In your resource config, specify which fields should be treated as uploads.

export const productsResource = defineResource({
name: "products",
// ...
uploads: {
image: {
folder: "products",
},
gallery: {
folder: "products/gallery",
},
},
});

How it Works​

1. Creation & Updates​

When you send a POST or PATCH request with a File or Blob object in the payload (using multipart/form-data or JSON with base64/blobs if supported by your client), Honocube will:

  1. Intercept the file field.
  2. Call your storage.upload function.
  3. Replace the file object with the returned path/key before saving to the database.

2. Recursive Uploads​

Honocube handles uploads even in related records. If you create a Post along with several Image relation records, the files within those images will be uploaded automatically.

3. URL Resolution​

When fetching records, Honocube automatically prepends the mediaBaseUrl to your upload fields.

  • Database value: products/123_thumb.png
  • API Response: https://cdn.example.com/products/123_thumb.png

This ensures your frontend always receives a fully-qualified URL.

Next, learn about Searching & Filtering.