Formly Storage
De eenvoudigste optie. Geef geen API keys aan je frontend. Formly beheert de vertrouwelijke credentials en uploadt veilig naar onze eigen infrastructuur (EU-regio). Ideaal voor quickstarts.
Stap-voor-stap gids voor het configureren van veilige bestandsuploadformulieren met opslagintegratie.
Om bestanden te accepteren, definieer je een veld met type: 'file' in je JSON-schema. Dit vertelt Formly om een upload-interface te genereren die compatibel is met moderne browsers.
Je kunt dit veld uitbreiden met label, help-tekst en verplichte validaties. Hieronder zie je een basisconfiguratie:
{
"key": "cv_upload",
"type": "file",
"templateOptions": {
"label": "Upload je CV",
"placeholder": "Klik hier om een bestand te kiezen",
"accept": ".pdf,.doc,.docx",
"maxSize": 10485760
}
}
Bescherm je applicatie tegen ongeldige bestanden door strikte validaties toe te passen.
.png,.jpg).5242880 voor 5MB).true om te forceren dat een bestand wordt geüpload.Formly valideert dit direct in de frontend voordat de gebruiker de knop indrukt, wat zorgt voor een soepelere ervaring.
Kies waar je bestanden veilig worden opgeslagen.
De eenvoudigste optie. Geef geen API keys aan je frontend. Formly beheert de vertrouwelijke credentials en uploadt veilig naar onze eigen infrastructuur (EU-regio). Ideaal voor quickstarts.
Gebruik de aws-s3 adapter. Upload direct naar jouw eigen bucket met directe toegang. Geschikt voor teams die al volledig in de AWS-ecosysteem zitten.
Via de azure-blob adapter. Synchroniseer bestanden met jouw Azure Storage Account. Volledige integratie met bestaande Azure pipelines.
Gebruikers willen weten hoe ver de upload is. Formly ondersteunt een onUploadProgress callback in je SDK. Dit ontvangt een percentage en de huidige snelheid (kb/s).
In de UI kan je dit verwerken met een CSS Progress Bar. Hieronder een conceptueel voorbeeld van de logica:
const onProgress = (progress) => {
const percent = Math.round(progress.loaded / progress.total * 100);
console.log(`Uploading: ${percent}%`);
// Update je progress bar width via ref
}
Bestandsuploads zijn een risico voor beveiliging. Formly biedt ingebouwde SecureScan functionaliteit.
Wanneer je een bestand uploadt naar Formly Storage, wordt dit automatisch gescand op bekende virussen en malware voordat het beschikbaar wordt gesteld via de API. Voor S3/Azure integraties kun je eventueel een webhook triggeren naar een externe scanner zoals ClamAV.
Zodra een bestand is geüpload, ontvang je in de API-response een unieke fileId. Om het bestand op te halen, gebruik je de volgende endpoint:
GET /v1/files/{fileId}
Deze aanvraag retourneert de directe download-URL, de bestandsgrootte, MIME-type en de hash (SHA-256) voor verificatie in je backend.
Hier is een compleet voorbeeld van een Vue 3 component dat gebruikmaakt van de Formly SDK, bevat validatie en een real-time voortgangsbalk.
<template>
<div class="upload-container">
<formly-form
:model="model"
:fields="fields"
:options="options"
/>
<div v-if="uploadProgress > 0" class="progress-wrapper">
<div class="progress-bar" :style="{ width: uploadProgress + '%' }"></div>
<p class="progress-text">{{ uploadProgress }}% geüpload</p>
</div>
<button type="button" @click="submitForm">Versturen</button>
</div>
</template>
<script setup>
import { ref, reactive } from 'vue';
import { FormlyForm, FormlyModule } from '@formly/vue';
import { createFormly } from '@formly/core';
const model = reactive({});
const options = reactive({});
const uploadProgress = ref(0);
const fields = [
{
key: 'resume',
type: 'file',
templateOptions: {
label: 'Upload CV',
accept: '.pdf',
maxSize: 5242880,
onUploadProgress: (event) => {
uploadProgress.value = Math.round((event.loaded / event.total) * 100);
}
}
}
];
const submitForm = async () => {
// Formly verzendt de payload automatisch naar de API
console.log('Formulier verstuurd met bestands-ID:', model.resume?.fileId);
};
</script>
<style scoped>
.upload-container { max-width: 600px; margin: 0 auto; }
.progress-wrapper { margin: 1rem 0; }
.progress-bar { height: 8px; background: var(--clr-accent); border-radius: 4px; transition: width 0.3s; }
.progress-text { font-size: 0.8rem; color: white; margin-top: 0.5rem; }
</style>