Delphi MVC: la gestione delle Form

di il
14 risposte

Delphi MVC: la gestione delle Form

Vorrei gestire una MultiPart Form caricando sia dati come stringhe di testo che un file binario.Volevo usare l'oggetto TMultiPartFormData come supporto.

Chiunque lo utilizzi questo framework,come fa a trasmettere su server i file binari?

14 Risposte

  • Re: Delphi MVC: la gestione delle Form

    03/09/2024 - GrandfatherCoder ha scritto:


    Chiunque lo utilizzi questo framework,come fa a trasmettere su server i file binari?

    Negli esempi forniti con il sorgente del framework ne trovi uno che fa proprio questo: guardalo direttamente qui su GitHub.

  • Re: Delphi MVC: la gestione delle Form

    Quindi se non ho capito male, il caricamento file posso gestirlo solo in fase di update del record?

    Cioè dopo l'inserimento di dati,aggiorno il/i campo/i contenente il nome del file?

  • Re: Delphi MVC: la gestione delle Form

    05/09/2024 - GrandfatherCoder ha scritto:


    Quindi se non ho capito male, il caricamento file posso gestirlo solo in fase di update del record?

    Il caricamento del file è una azione che avviene mandando in POST i dati del file, assieme ad altri campi opzionali.

    Se si tratta di un file da allegare a un record, l'inserimento potrebbe avvenire contestualmente alla fase di salvataggio dei dati del record.

    05/09/2024 - GrandfatherCoder ha scritto:


    Cioè dopo l'inserimento di dati,aggiorno il/i campo/i contenente il nome del file?

    Il caricamento del file trasferisce i dati del file, non solo il nome. Quei dati si possono salvare su DB, o su disco. Se li salvi su disco, puoi determinare il nome del file da utilizzare, scrivere il file, prendere il percorso e salvare quell'informazione assieme alle altre che sono arrivate dalla pagina all'interno del record.

    Dipende tutto da cosa devi fare e come decidi di organizzare le informazioni.

    L'unica cosa da tenere presente è che l'upload di un file è solo l'invio di un campo, opzionalmente aggiuntivo (con altri campi), che contiene i dati del file e poche altre informazioni. Di quei dati ne fai ciò che vuoi. Puoi farli inserire dopo che il record è stato salvato, aggiornandolo, metterli in un'altra tabella, lasciarli su disco, vedi tu.

  • Re: Delphi MVC: la gestione delle Form

    06/09/2024 - Alka ha scritto:


    l caricamento del file è una azione che avviene mandando in POST i dati del file, assieme ad altri campi opzionali.

    Se si tratta di un file da allegare a un record, l'inserimento potrebbe avvenire contestualmente alla fase di salvataggio dei dati del record.

    Normalmente è così.

    Sono anni che sviluppo.

    Il problema è come serializzare o far passare una form multipart.

    Io temevo che fosse una utopia con DMVC e pensavo ad altre soluzioni che contemplavano un dividere i dati tra stringhe(caricate in POST) e files (successivamente caricati in UPDATE).

    Ho provato a servirmi dell'oggetto della classe TMultiPartForm,ma mi sembra ottimo ad incapsulare dati,ma poco pratico nel permettere di estrapolarli.

    06/09/2024 - Alka ha scritto:


    Il caricamento del file trasferisce i dati del file, non solo il nome. Quei dati si possono salvare su DB, o su disco. Se li salvi su disco, puoi determinare il nome del file da utilizzare, scrivere il file, prendere il percorso e salvare quell'informazione assieme alle altre che sono arrivate dalla pagina all'interno del record.

    Mi farebbe comodo che i files vengano stoccati come campi Blob nel database.

    Delphi pare avere decennale esperienza in questo campo e ci sono validi esempi in rete con Firebase.

    Ma ciò è un passo successivo..al momento vorrei riuscire a gestire una form multiparte.

  • Re: Delphi MVC: la gestione delle Form

    06/09/2024 - GrandfatherCoder ha scritto:


    Normalmente è così.

    Se parliamo di HTTP(S), è proprio così.

    06/09/2024 - GrandfatherCoder ha scritto:


    Il problema è come serializzare o far passare una form multipart.

    Qual è il problema?

    Questa è una form multipart che invia un campo e un file in upload.

    <form action="/file/upload" method="post" enctype="multipart/form-data">
      <input type="text" name="description"><br>
      <input type="file" name="fileToUpload"><br>
      <input type="submit" name="submit">
    </form>

    Non serve altro.

    06/09/2024 - GrandfatherCoder ha scritto:


    Ho provato a servirmi dell'oggetto della classe TMultiPartForm,ma mi sembra ottimo ad incapsulare dati,ma poco pratico nel permettere di estrapolarli.

    Nell'esempio che ti avevo indicato, in Request.Context.Files hai un array dei file inviati: basta accedere alle proprietà del singolo file per ottenere nome (non il percorso, per privacy), il nome assegnato al campo, lo Stream con i dati (vedi la documentazione).

    Non vedo problematiche. Se hai difficoltà, spiega quali sono.

    06/09/2024 - GrandfatherCoder ha scritto:


    Mi farebbe comodo che i files vengano stoccati come campi Blob nel database.

    Attenzione che potrebbe non essere sempre una buona idea: da un lato hai il vantaggio che ti porti i file “appresso” ai dati, dall'altro il database potrebbe “esplodere” di dimensioni, e ogni backup/restore del DB a sé stante coinvolgerebbe sempre anche i suddetti file.

    La questione va analizzata attentamente.

    06/09/2024 - GrandfatherCoder ha scritto:


    Delphi pare avere decennale esperienza in questo campo e ci sono validi esempi in rete con Firebase.

    Intendi Firebird? Ad ogni modo, non è una questione legata all'esperienza di Delphi: i campi BLOB ci sono sempre stati e ogni tool, da ADO a ODBC, li ha sempre gestiti, anche su Access dove sono più “particolari” (legati a OLE). Come tanti altri ambienti, Delphi lo ha sempre supportato, questo sì.

    06/09/2024 - GrandfatherCoder ha scritto:


    Ma ciò è un passo successivo..al momento vorrei riuscire a gestire una form multiparte.

    Vedi le indicazioni fornite sopra.

  • Re: Delphi MVC: la gestione delle Form

    Attenzione che potrebbe non essere sempre una buona idea: da un lato hai il vantaggio che ti porti i file “appresso” ai dati, dall'altro il database potrebbe “esplodere” di dimensioni, e ogni backup/restore del DB a sé stante coinvolgerebbe sempre anche i suddetti file.

    Si tratta di un database modesto(max 1000 records se proprio si vuole esagerare)

    Comunque al momento,per praticità, ho adottato la soluzione dei files ed il mio problema adesso è quello dell'escaping del doppio backslah del path del file che si manifesta nella formattazione in JSON.

    Nell'esempio che ti avevo indicato, in Request.Context.Files hai un array dei file inviati: basta accedere alle proprietà del singolo file per ottenere nome (non il percorso, per privacy), il nome assegnato al campo, lo Stream con i dati (vedi la documentazione).

    Non vedo problematiche. Se hai difficoltà, spiega quali sono.

    I Files li ho gestiti tramite questo array.

    Per il resto ho risolto il mio problema con la multipart form: tramite Context.Request.ContentField che è un array di records ho ricreato il dataset e una volta “farcito” dato in pasto al modello tramite la sua funzione LoadByDataset.

  • Re: Delphi MVC: la gestione delle Form

    13/09/2024 - GrandfatherCoder ha scritto:


    Si tratta di un database modesto(max 1000 records se proprio si vuole esagerare)

    Magari il file allegato a ciascun record è di 4GB… chi lo sa. :D

    13/09/2024 - GrandfatherCoder ha scritto:


    Comunque al momento,per praticità, ho adottato la soluzione dei files ed il mio problema adesso è quello dell'escaping del doppio backslah del path del file che si manifesta nella formattazione in JSON.

    Non so bene in quale contesto hai un JSON con dentro il percorso di un file, perché dallo scenario che hai descritto non c'è alcuna situazione che lo richiede: in fase di invio del file, non viene inviato il path ma i dati del file, mentre in fase di salvataggio su DB del percorso non andrebbe scritto il path completo, mentre restituirlo in JSON non avrebbe molto senso, perché nessun client se ne fa nulla visto che non può accedere al percorso di fatto. In breve, è un “red flag” di qualcosa di sbagliato, anche se non saprei dirti cosa e dove.

    Al netto delle considerazioni sopra, l'escaping non dovrebbe essere un problema, perché qualunque libreria di gestione del formato JSON è perfettamente in grado di gestire questa casistica, quindi se devi fare tu l'escaping, probabilmente stai adottando una implementazione manuale (es. usi il JSON come stringa invece delle classi preposte a generarlo o a interpretarlo).

  • Re: Delphi MVC: la gestione delle Form

    13/09/2024 - Alka ha scritto:


    Magari il file allegato a ciascun record è di 4GB… chi lo sa. :D

    Se le cose stessero cosi,sarebbe meglio che io cambiassi professione…non sono così stolto da ficcarci un pachiderma in un campo blob!

    Trattandosi di immagine da miniatura,i files devono avere massimo una dimensione di 2Mb.

    A ripensarci ho avuto una piccola svista.

    Problema risolto.

  • Re: Delphi MVC: la gestione delle Form

    13/09/2024 - GrandfatherCoder ha scritto:


    Se le cose stessero cosi,sarebbe meglio che io cambiassi professione…non sono così stolto da ficcarci un pachiderma in un campo blob!

    Per precisare, ovviamente era una battuta. :D

  • Re: Delphi MVC: la gestione delle Form

    Per quanto righarda il path del file,avevo salvato su DB il path relativo.

    Lavorando con sistemi Linux che come separatore delle directory usa il carattere slash,non mi aspettavo di avere problemi col backslah usato da Window.

    Avevo memorizzato il percorso uploadedfiles\immagine.jpg

  • Re: Delphi MVC: la gestione delle Form

    13/09/2024 - GrandfatherCoder ha scritto:


    Lavorando con sistemi Linux che come separatore delle directory usa il carattere slash,non mi aspettavo di avere problemi col backslah usato da Window.

    Infatti non ci sono problemi in generale con quel carattere. Il problema semmai è quando il carattere viene inserito all'interno di un formato in cui ha un significato particolare, ma vale anche per tanti altri caratteri (es. " oppure ') e le librerie di serializzazione del dato, o di accesso ai database generiche, sono perfettamente in grado di gestirli.

    13/09/2024 - GrandfatherCoder ha scritto:


    Avevo memorizzato il percorso uploadedfiles\immagine.jpg

    Ok, mi pare che vada bene. Dov'è il problema?

    Se non spieghi meglio, non si capisce qual era la problematica originale, qual è quella attuale, se hai risolto e come: in breve, la discussione diventa un po' strana ma più che altro poco utile.

  • Re: Delphi MVC: la gestione delle Form

    14/09/2024 - Alka ha scritto:


    Se non spieghi meglio, non si capisce qual era la problematica originale, qual è quella attuale, se hai risolto e come: in breve, la discussione diventa un po' strana ma più che altro poco utile.

    Decisamente inutile la discussione.

    Perchè per mio vizio il path completo essendo univoco per tutti i files,volevo salvarlo nel file di configurazione.

    Anchè perchè nel leggere il database diventa quasi antipatico vedere delle righe ripetitive.

    Nel campo del nome file nel DB solo il path relativo o il nome del file.

    Sarà una mia paranoia.

  • Re: Delphi MVC: la gestione delle Form

    14/09/2024 - GrandfatherCoder ha scritto:


    Perchè per mio vizio il path completo essendo univoco per tutti i files,volevo salvarlo nel file di configurazione.

    Mi sembra una scelta opportuna.

    14/09/2024 - GrandfatherCoder ha scritto:


    Anchè perchè nel leggere il database diventa quasi antipatico vedere delle righe ripetitive.

    Nel campo del nome file nel DB solo il path relativo o il nome del file.

    Sarà una mia paranoia.

    No, ci sta. Più che per antipatia, per il fatto che se vuoi spostare i file in un'altra cartella, mantenendo il percorso relativo, puoi farlo aggiornando poi solo la voce di configurazione.

  • Re: Delphi MVC: la gestione delle Form

    15/09/2024 - Alka ha scritto:


    No, ci sta. Più che per antipatia, per il fatto che se vuoi spostare i file in un'altra cartella, mantenendo il percorso relativo, puoi farlo aggiornando poi solo la voce di configurazione.

    Infatti.

    Ho pure il vantaggio di maggiore dinamicità.

Devi accedere o registrarti per scrivere nel forum
14 risposte