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 spentoPubblico: si apre senza login, anche da email o pagine esterneServe una sessione
upload_secure accesoServe una sessione che vede la colonna sulla route (permessi di getFlatRecordData): senza login 401, senza permesso 403Stessa 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 se UseRouteNameAsSubfolder e' 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 (DefaultUploadRootPath o UseRouteNameAsSubfolder).
  • 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 con Content-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.png compreso): 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_size sempre insieme per hardening.
  • con upload multiplo, verificare mapping campi MultipleUpload* metadata.
  • caricamento e /api/UploadImage richiedono il login; /upload lo richiede solo per le colonne upload_secure (vedi "Accesso ai file caricati"). Il download restituisce solo file della cartella del record: del parametro filename conta solo il nome del file.
  • sottocartelle (UseRouteNameAsSubfolder, UseRecordIDAsSubfolder) e DefaultUploadRootPath li 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' uploadFolder se assoluto, altrimenti <projectDataFolder>/Upload, la stessa su tutti i provider.

Screenshot

field-widget-upload / field-editor-upload-tab
field-widget-upload / field-editor-upload-tab