Middleware per scaricare un file zip

di il
13 risposte

Middleware per scaricare un file zip

Ciao ragazzi, ho un problema enorme con il codice che ho scritto, praticamente il programma dovrebbe andare a recuperare degli oggetti contenuti in una cartella di un container generico e scaricare questi file in formato zip, le librerie che sto utilizzando sono le swiftclient, le librerie di swift per effettuare le operazioni sullo storage.

Praticamente il programma si pianta all'esecuzione della funzione per creare il file zip, i log mi danno l'esecuzione corretta fino al prelievo degli oggetti dalla cartella contenuta nel container(bucket) dopo di che l'esecuzione per la creazione del file zip mi da il problema.

Ho eseguito il codice e fatto vari debug tramite i log, il problema sorge dopo il secondo with nella funzione create_zip_file

with ZipFile(zip_file_path, ‘w’) as zip_object:
…

E' possibile che non ci siano i permessi per scrivere il file zip nella directory temporanea del sistema operativo?

13 Risposte

  • Re: Middleware per scaricare un file zip

    28/08/2023 - Domeniks88 ha scritto:


    Praticamente il programma si pianta all'esecuzione della funzione per creare il file zip, i log mi danno l'esecuzione corretta fino al prelievo degli oggetti dalla cartella contenuta nel container(bucket) dopo di che l'esecuzione per la creazione del file zip mi da il problema.

    Cosa intendi con “si pianta”?

  • Re: Middleware per scaricare un file zip

    28/08/2023 - Alka ha scritto:


    28/08/2023 - Domeniks88 ha scritto:


    Praticamente il programma si pianta all'esecuzione della funzione per creare il file zip, i log mi danno l'esecuzione corretta fino al prelievo degli oggetti dalla cartella contenuta nel container(bucket) dopo di che l'esecuzione per la creazione del file zip mi da il problema.

    Cosa intendi con “si pianta”?

    Nel senso che non viene eseguito, va in errore, forse mi sono espresso male scusatemi

  • Re: Middleware per scaricare un file zip

    28/08/2023 - Domeniks88 ha scritto:


    Nel senso che non viene eseguito, va in errore, forse mi sono espresso male scusatemi

    Ok, quindi lo chiedo in modo diverso: qual è l'errore?

    Scusa ma senza dettagli l'unica cosa che si può fare è imbastire un sistema come il tuo, copiare il codice, replicare l'intero scenario e testarlo: non mi pare né comodo né opportuno.

    Fornisci quante più informazioni possibili sul problema che ottieni: dire “va in errore” o “si pianta” è come andare dal dottore e dire “sto male”, o dal meccanico e dire che la propria auto “non va”.

  • Re: Middleware per scaricare un file zip

    28/08/2023 - Alka ha scritto:


    28/08/2023 - Domeniks88 ha scritto:


    Nel senso che non viene eseguito, va in errore, forse mi sono espresso male scusatemi

    Ok, quindi lo chiedo in modo diverso: qual è l'errore?

    Scusa ma senza dettagli l'unica cosa che si può fare è imbastire un sistema come il tuo, copiare il codice, replicare l'intero scenario e testarlo: non mi pare né comodo né opportuno.

    Fornisci quante più informazioni possibili sul problema che ottieni: dire “va in errore” o “si pianta” è come andare dal dottore e dire “sto male”, o dal meccanico e dire che la propria auto “non va”.

    Eh lo so ma non da un errore specifico, gli ho messo i log di debug proprio per capire dove andava in crash l'esecuzione, infatti il recupero degli oggetti dalla cartella vengono effettuati correttamente, ma proprio nella funzione per creare il file zip, nell'apertura del file in modalità scrittura la linea non viene eseguita, il problema è che non mi da un errore specifico, non è che c'è qualche modo per vedere l'errore ? Purtroppo più di queste informazioni non riesco a fornire

    questo è il log dell'applicazione, viene eseguita fino alla creazione della directory temporanea con il nome archivio.zip, quindi i log funzionano fino a logging.debug(zip_file_path), il log dentro la with ZipFile(zip_file_path,"w") non funziona, quindi presumo ci sia qualche errore nella creazione del file zip in scrittura, ho provato qualche soluzione alternativa con chatgbp, gli ho incollato tutto il codice, e mi dava qualche suggerimento ad esempio per scrivere il file zip in memoria RAM e poi inviarlo in response come stream, ma sinceramente non mi faceva nemmeno configurare lo script in questo modo 

        def create_zip_file(self, objects, auth_token, storage_url, container_name):
            
            with tempfile.TemporaryDirectory() as temp_dir:
                zip_file_path = os.path.join(temp_dir, 'archivio.zip')
                logging.debug(zip_file_path)
                    
                # Create the zip file in the temporary directory
                    
                with ZipFile(zip_file_path, 'w') as zip_object:
                    for obj in objects:
                        object_name = obj["name"]
                        logging.debug(object_name)
                        # Retrieve object data
                        object_data = self.retrieve_object(auth_token, storage_url, container_name, object_name)
                        logging.debug(object_data)
                        zip_object.write(object_data)
            
            return zip_file_path
  • Re: Middleware per scaricare un file zip

    28/08/2023 - Domeniks88 ha scritto:


    Eh lo so ma non da un errore specifico, gli ho messo i log di debug proprio per capire dove andava in crash l'esecuzione, infatti il recupero degli oggetti dalla cartella vengono effettuati correttamente, ma proprio nella funzione per creare il file zip, nell'apertura del file in modalità scrittura la linea non viene eseguita, il problema è che non mi da un errore specifico, non è che c'è qualche modo per vedere l'errore ?

    Hai provato a mettere un try…except per intercettare l'errore ed eventualmente loggarlo sul file?

  • Re: Middleware per scaricare un file zip

    29/08/2023 - Alka ha scritto:


    28/08/2023 - Domeniks88 ha scritto:


    Eh lo so ma non da un errore specifico, gli ho messo i log di debug proprio per capire dove andava in crash l'esecuzione, infatti il recupero degli oggetti dalla cartella vengono effettuati correttamente, ma proprio nella funzione per creare il file zip, nell'apertura del file in modalità scrittura la linea non viene eseguita, il problema è che non mi da un errore specifico, non è che c'è qualche modo per vedere l'errore ?

    Hai provato a mettere un try…except per intercettare l'errore ed eventualmente loggarlo sul file?

    Ciao allora grazie per la risposta, il problema era quello che temevo, ovvero non ho i permessi di scrittura di un file in una directory del OS dove viene eseguito lo script. Ho cambiato implementazione, ho inserito la creazione del file in memoria RAM, e funziona, ovviamente non va bene come implementazione perchè per un file zip piccolo non è un problema ma per file zip di storage ovviamente si, il collega mi ha detto che mi devo assicurare che il percorso contenente il file zip da creare abbia i permessi necessari, ecco qua non so come procedere

  • Re: Middleware per scaricare un file zip

    29/08/2023 - Domeniks88 ha scritto:


    il collega mi ha detto che mi devo assicurare che il percorso contenente il file zip da creare abbia i permessi necessari, ecco qua non so come procedere

    Beh, effettivamente lo comprendo, nel senso che non sei tu a dover risolvere questo problema: se hai fatto il deploy del tuo applicativo verso una architettura fornita da un provider, ti deve comunicare un percorso nel quale puoi scrivere, oppure devi reperirlo leggendo la documentazione.

    In ogni caso, a meno che non mi sfugga qualcosa, è un dato che ti deve essere comunicato (ossia ti devono dire “in questa cartella puoi scrivere”) oppure che può essere configurato (ossia sei tu a dover dire “createmi questa cartella in cui posso scrivere”).

    Se nessuna delle due opzioni è fattibile, la vedo buia, anche se si potrebbero valutare soluzioni per restituire “progressivamente” il file zippato (se si tratta di un download) durante la sua costruzione, ovvero bufferizzarne la creazione e relativa restituizione senza tenere in memoria tutto il file, ma solo delle porzioni. Tuttavia, c'è un pochino di analisi, ricerca e sviluppo da fare… :)

  • Re: Middleware per scaricare un file zip

    29/08/2023 - Alka ha scritto:


    29/08/2023 - Domeniks88 ha scritto:


    il collega mi ha detto che mi devo assicurare che il percorso contenente il file zip da creare abbia i permessi necessari, ecco qua non so come procedere

    Beh, effettivamente lo comprendo, nel senso che non sei tu a dover risolvere questo problema: se hai fatto il deploy del tuo applicativo verso una architettura fornita da un provider, ti deve comunicare un percorso nel quale puoi scrivere, oppure devi reperirlo leggendo la documentazione.

    In ogni caso, a meno che non mi sfugga qualcosa, è un dato che ti deve essere comunicato (ossia ti devono dire “in questa cartella puoi scrivere”) oppure che può essere configurato (ossia sei tu a dover dire “createmi questa cartella in cui posso scrivere”).

    Se nessuna delle due opzioni è fattibile, la vedo buia, anche se si potrebbero valutare soluzioni per restituire “progressivamente” il file zippato (se si tratta di un download) durante la sua costruzione, ovvero bufferizzarne la creazione e relativa restituizione senza tenere in memoria tutto il file, ma solo delle porzioni. Tuttavia, c'è un pochino di analisi, ricerca e sviluppo da fare… :)

    Beh si le soluzione ci sono forse però così è difficile, mi potresti indicare solo come posso risolvere questo fatto, praticamente, il file zip viene creato e restituito nel body della response, il problema è che viene visualizzato e non scaricato in qualche directory, come posso modificarlo affinchè la richiesta mi restituisca un download?

    Ecco come viene visualizzato su postman

    Può essere che nella funzione restituisco il valore con getvalue() del file zip creato e non il file vero e proprio?

    Questa è la funzione:

  • Re: Middleware per scaricare un file zip

    Ciao no funziona, basta che faccio send and download nella richiesta su postman, però il problema resta, devo trovare un'altra soluzione, come mi hai indicato anche tu, cioè restituire “progressivamente” il file zippato durante la sua costruzione, ovvero bufferizzarne la creazione e relativa restituizione senza tenere in memoria tutto il file

  • Re: Middleware per scaricare un file zip

    29/08/2023 - Domeniks88 ha scritto:


    però il problema resta, devo trovare un'altra soluzione, come mi hai indicato anche tu, cioè restituire “progressivamente” il file zippato durante la sua costruzione, ovvero bufferizzarne la creazione e relativa restituizione senza tenere in memoria tutto il file

    Non conosco purtroppo la piattaforma che stai utilizzando per lo sviluppo dell'applicazione.

  • Re: Middleware per scaricare un file zip

    Va bene scusate ma visto che ho risolto parzialmente tolgo il codice intero

  • Re: Middleware per scaricare un file zip

    Ciao scusate ma ho un altro problema, praticamente ho scritto un'altro script per un'altra funzionalità, il problema è che il server non riesce a risolvere le dipendenze dalle librerie esterne in quanto non è possibile installare con il comando pip install alcun modulo esterno, ora il tutor mi ha suggerito una soluzione, che sarebbe mettere le librerie direttamente nella stessa cartella dello script, ma come faccio ad mettere manualmente le librerie, cioè mica conosco i file che lo script va ad usare ?

  • Re: Middleware per scaricare un file zip

    31/08/2023 - Domeniks88 ha scritto:


    scusate ma ho un altro problema

    Per ogni nuovo problema, una nuova discussione. :)

Devi accedere o registrarti per scrivere nel forum
13 risposte