Overview
Widget Upload
Widget colonna per caricamento file con tab dedicato Caricatore/Upload nel metadata-editor colonne.
Quando usarlo
- allegati documento/immagine su record.
- upload singolo o multiplo con metadata file.
- scenari con thumbnail e validazioni tipo/dimensione.
Proprieta metadata colonna (tab Upload)
isImageUpload: abilita gestione immagini + preview.isDBUpload: persistenza file nel DB.isMultipleUpload: upload multiplo.IsZippedUpload: supporto archivi zip.UseRouteNameAsSubfolder: sottocartella da route.UseRecordIDAsSubfolder: sottocartella da record id.DefaultUploadRootPath: path root upload.allowed_file_types: whitelist estensioni/MIME.max_file_size: size massima file.createThumb,thumbWidth,thumbHeight: gestione miniature.customUploadHandlerPath: endpoint upload custom.upload_secure(Secure upload): i file della colonna si leggono solo con una sessione che vede la colonna; senza, sono pubblici. Vedi sotto.
mc_props_bag utile
Snippet 1JSON
{
"uploader": {
"beforeUpload": "function(event, field, record){ return true; }"
},
"style": {
"editCss": "min-height: 52px;"
},
uploader.beforeUpload: hook client pre-submit upload.style.editCss: stile area uploader.form.columns: layout form.
Effetti Client/Server
- Client: picker file, preview, validazioni immediate.
- Server: storage su DB o filesystem secondo metadata.
Accesso ai file caricati
| Colonna | /upload/... (file su disco) | /api/UploadImage (anteprime, BLOB) |
|---|---|---|
upload_secure spento | Pubblico: si apre senza login, anche da email o pagine esterne | Serve una sessione |
upload_secure acceso | Serve una sessione che vede la colonna sulla route (permessi di getFlatRecordData): senza login 401, senza permesso 403 | Stessa regola: senza permesso sulla colonna 403 |
- La cartella protetta e' quella in cui la colonna salva:
DefaultUploadRootPath(o la radice) piu' la sottocartella della route seUseRouteNameAsSubfoldere' acceso. Se una colonna sicura salva nella radice condivisa, tutta la radice diventa protetta: per tenere pubblici gli altri file dare alla colonna sicura una cartella propria (DefaultUploadRootPathoUseRouteNameAsSubfolder). - I file gia' caricati non si spostano: conta il percorso. Cambiare il flag ha effetto entro due minuti, subito dopo l'invalidazione dei metadati.
- Un link diretto a un file protetto non funziona fuori dall'applicazione (email, siti esterni): li' servono file di colonne non sicure.
- Ospite (
enableGuest=true): legge i file protetti delle colonne che vede, come per le API. - Qualunque file viene servito con
X-Content-Type-Options: nosniff; tutto cio' che non e' immagine, pdf, audio o video viene scaricato come allegato conContent-Security-Policy: sandbox, quindi un file caricato non gira mai come pagina dell'applicazione. - Estensioni rifiutate al caricamento, su ogni parte del nome (
foto.php.pngcompreso): eseguibili e script lato server (aspx,php,jsp,exe,dll,ps1,sh, ...) e contenuto attivo (html,htm,svg,js,swf, ...).
Note operative
- usare
allowed_file_types+max_file_sizesempre insieme per hardening. - con upload multiplo, verificare mapping campi
MultipleUpload*metadata. - caricamento e
/api/UploadImagerichiedono il login;/uploadlo richiede solo per le colonneupload_secure(vedi "Accesso ai file caricati"). Il download restituisce solo file della cartella del record: del parametrofilenameconta solo il nome del file. - sottocartelle (
UseRouteNameAsSubfolder,UseRecordIDAsSubfolder) eDefaultUploadRootPathli decide il metadato di colonna letto dal server; i valori inviati dal client valgono solo se la colonna non si risolve (handler custom). La radice e'uploadFolderse assoluto, altrimenti<projectDataFolder>/Upload, la stessa su tutti i provider.
Screenshot
