Visualizzazione dei risultati da 1 a 10 su 10

Discussione: Forma migliore per trasferire N file dal server php al client

  1. #1
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    578

    Forma migliore per trasferire N file dal server php al client

    Ciao a tutti,

    ho un dubbio riguardo il metodo che potrei utilizzare per trasferire dei file protetti (encrypted) dal server a un utente specifico, è un'operazione che avviene solo i determinati momenti della giornata.
    L'utente in questione si collega ad una determinata pagina e io devo passargli tutti i file, oltre ad altre informazioni.
    I file originariamente sono file pdf, quindi potrebbero occupare diversi mb e potrebbero essere anche una decina.
    Si potrebbe arrivare tranquillamente a 300/400 MB di 10 file totali.
    All'inizio pensavo di metterli in un array e passarli come json, però la dimensione è troppa per poterlo fare!

    Che cosa mi suggerite?

    Grazie,
    Roberto

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2011
    residenza
    Arezzo
    Messaggi
    163
    per passare al client intendi fare il download?
    Riccardo Sadocchi
    Microsoft MCP C#

  3. #3
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,327
    @robynosse

    Che strana idea di mettere i dati di file in un json. Soprattuto che dopo che cosa ne fai visto che non si possono salvare i dati dal client.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    578
    Quote Originariamente inviata da badaze Visualizza il messaggio
    @robynosse

    Che strana idea di mettere i dati di file in un json. Soprattuto che dopo che cosa ne fai visto che non si possono salvare i dati dal client.
    Ho iniziato ad utilizzare la classe ZipArchive, ho messo i file che devo trasferire in un unico file zip.
    Devo enviare i dati e il file al cliente che si connette.
    Per i dati gli restituisco un testo in formato json.
    Come potrei fare per il file.zip.
    Come mi consigliate di passarlo al client, visto che è lui che si connette, vorrei che la richiesta fosse unica, intendo si connette alla pagina:

    miosito.com/dati-e-file/

    e scarica i dati in formato json e il file .zip.

    Come mi consigliate di operare?
    Devono esserci due richieste (pagine) differenti o posso fare tutto nella stessa pagina?

    Grazie,
    Roberto

  5. #5
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,327
    Ti rispondero’ stasera.
    In poche parole si usano gli header.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  6. #6
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,327
    Pensavo di usare gli header. E' fattibile ma un buon.

    codice:
    <a href="mio_file.zip">mio_file.zip</a>
    basta.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    578
    Quote Originariamente inviata da badaze Visualizza il messaggio
    Pensavo di usare gli header. E' fattibile ma un buon.

    codice:
    <a href="mio_file.zip">mio_file.zip</a>
    basta.
    Purtroppo come soluzione non è fattibile.
    Ti spiego:
    ho la necessità di fare scaricare dei contenuti a una macchina, la URL verrà lanciata da un cron su questa macchina.
    In pratica viene fatta una prima richiesta GET con un cron a una pagina, dopo 30 secondi ne viene fatta un'altra che, se tutto è andato bene (parametri passati, ora esatta della richiesta con un margine di x minuti), restituisce dei dati encrypted come testo, se qualche cosa va storto, blocca le comunicazioni, ovvero non restituisce più niente fino a che non si sblocca manualmente.
    All'interno di questo testo, vengono messi dei dati, che sono dei form e un file zip, che a sua volta contiene tutti i file encrypted, non posso fare due richieste separate per i form e 1 per i file, devo mettere tutto assieme.
    Domani posto il codice di creazione del file zip, sicuramente ci sono passaggi che si possono ottimizzare/inutili, così mi dai una tua opinione.

    Grazie,
    Roberto

  8. #8
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    578
    Ecco il codice che utilizzo, funziona.
    Vorrei evitare di creare un file e subito dopo doverlo leggere per trasmetterlo.



    E' possibile?

    codice:
        private function getFileZip($array) {//$array contiene i nomi originali dei file da zippare
            $nomeFile = "miofile.zip";
    
            $zip = new ZipArchive();
            $indirizzo = DIREZIONE . self::UPLOAD . $nomeFile;
            //apro il file zip
            if ($zip->open($indirizzo, ZipArchive::CREATE) !== TRUE) {
                return FALSE;
                exit("Non ho potuto aprire <$indirizzo>\n");
            }
            foreach ($array as $index => $file) {
                //aggiungo il file
                $zip->addFile(DIREZIONE . self::UPLOAD . $file);
            }
            $zip->close();
            //leggo il file appena creato, il metodo getFile non fa altro che restituire il file(utilizzo file_get_contents), se esite
            $fileCaricato = $this->getFile(self::UPLOAD . $nomeFile);
            return base64_encode($fileCaricato);
        }
    Grazie,
    Roberto

  9. #9
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,327
    Mettiamo che tu conosca a priori il nome del e della cartella dove sta.
    Ti basta mettere un link al file e quando l’utente clicca sul file gli si chiede di salvarlo.
    Se l’utente si collega mentre il file non è pronto gli si chiede di aggiornare la pagina tramite un bottone.

    controllo l’esistenza del file
    se il file esiste creo un tag a con link al file.
    se il file non esiste stampo a video un messaggio « file non ancora pronto - aggiornare la pagina »

    Se sai usare ajax (con o senza jquery) e javascript puoi anche fare in modo di controllare l’esistenza del file ogni tot secondi.

    PS : non ho capito la storia dei dati json. Se si tratta di un file lo puoi aggiungere allo zip.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  10. #10
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    578
    Il problema e' che non esiste iterazione con il cliente, il processo e' automatico (uso cron).
    Con cron si lancer�, ad un' ora prestabilita, il processo, mediante un url, la pagina dovr� restituire solo testo.
    Nel testo, restituito dal server web, dovra' essere contenuto, un array (in formato json) e un file zip, tutto verra' encrypted,.
    Non posso mettere dei link per il download.

    Per farti un esempio:
    codice:
    {'array':stringa_dell_array_in json,'files':stringa_del_file_compressi_in_zip}
    Il tutto viene codificato e il server restituisce solo caratteri incomprensibili.
    La pagina ricevuta viene decodificata e si estrapolano i dati.

    Il mio problema adesso e' che il metodo che utilizzo per la compressione dei file, mi 'costringe' a creare un file temporaneo su disco, e vorrei evitarlo:

    codice:
        private function getFileZip($array) {//$array contiene i nomi originali dei file da zippare
            $nomeFile = "miofile.zip";
    
            $zip = new ZipArchive();
            $indirizzo = DIREZIONE . self::UPLOAD . $nomeFile;
            //apro il file zip
            if ($zip->open($indirizzo, ZipArchive::CREATE) !== TRUE) {
                return FALSE;
                exit("Non ho potuto aprire <$indirizzo>\n");
            }
            foreach ($array as $index => $file) {
                //aggiungo il file
                $zip->addFile(DIREZIONE . self::UPLOAD . $file);
            }
            $zip->close();
            //leggo il file appena creato, il metodo getFile non fa altro che restituire il file(utilizzo file_get_contents), se esite
            $fileCaricato = $this->getFile(self::UPLOAD . $nomeFile);
            return base64_encode($fileCaricato);
        }
    In pratica creo un file dal nome
    miofile.zip

    aggiungo file per file:
    codice:
    $zip->addFile(DIREZIONE . self::UPLOAD . $file);
    Chiudo il file zip.
    Leggo il file zip e lo metto in una variabile.
    Cancello il file con unlink (questa linea di comando non e' presente nel codice postato)
    Restituisco la variabile.

    Come posso evitare di creare un file e lavorare solo in memoria?

    Grazie,
    Roberto
    Ultima modifica di robynosse; 04-10-2018 a 09:25

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2018 vBulletin Solutions, Inc. All rights reserved.