Come scaricare file con Node.js

Come scaricare file con Node.js

Il download di file nell’archivio locale anziché tenerli nell’archivio cloud presenta numerosi vantaggi. Questi includono un accesso più semplice, l’accesso senza una connessione Internet e la completa proprietà dei tuoi dati.

Puoi scaricare file singoli e multipli utilizzando i moduli Node.js integrati. Puoi anche utilizzare una libreria di terze parti per ottenere gli stessi risultati.

Download di file senza una libreria di terze parti

Per scaricare un file utilizzando Node.js, senza l’ausilio di pacchetti di terze parti, avrai bisogno di tre moduli Node.js principali: fs , https e path .

Il modulo fs supporta molte attività di file tra cui leggere, creare, aggiornare, rimuovere e rinominare. Il modulo https crea un server Web per gestire le richieste e fornire risposte. Il modulo path fornisce un modo per interagire con directory e percorsi di file.

Utilizzando questi moduli, puoi inviare una richiesta HTTP GET per accedere a una risorsa file da un server Web e quindi creare una copia della risorsa nel tuo sistema locale.

Per iniziare, importa i moduli richiesti:

const https = require('https');
const fs = require('fs');
const path = require('path');

Dovrai utilizzare il nome del file dall’URL come un buon nome predefinito per salvarlo. Puoi usare il metodo .basename() del modulo path per ottenere il nome di un file dal suo URL. Questo metodo accetta un argomento di percorso e restituisce l’ultima parte di un percorso.

Per esempio:

const filename = path.basename(url);

Quindi, richiedi il file al server invocando il metodo https.get() . Questo metodo accetta l’URL come primo argomento e una funzione di callback per la risposta come secondo argomento

Passa la variabile url come primo argomento e quindi una funzione di callback per l’elaborazione quando questo metodo riceve un flusso di risposta:

https.get(url, (res) => {
})

Nella funzione di callback, puoi utilizzare il metodo fs.createWriteStream() per creare un nuovo flusso scrivibile, passando la variabile nome file come argomento.

Per esempio:

const fileStream = fs.createWriteStream(filename);
res.pipe(fileStream);

Il metodo createWriteStream() facilita il processo di scrittura dei dati in un file, specialmente quando si gestiscono grossi blocchi di dati.

Il metodo pipe() invia quindi il flusso di dati di risposta GET all’oggetto fileStream .

Per registrare un messaggio nella console dopo che lo script ha terminato il download del file, allegare un emettitore di eventi .on () alla variabile fileStream:

fileStream.on('finish', () => {
  fileStream.close();
  console.log('Download finished');
});

L’oggetto fileStream emette un evento finish quando ha scritto tutti i dati nel file. Cattura questo tramite il metodo .on() e fornisci una funzione di callback per chiudere il fileStream e registrare un messaggio nella console.

Per una migliore esecuzione e un’efficiente riusabilità dello script, avvolgere questo codice in una funzione che prende l’URL come argomento:

function downloadFile(url) {
    const filename = path.basename(url);

    https.get(url, (res) => {
        const fileStream = fs.createWriteStream(filename);
        res.pipe(fileStream);


        fileStream.on('finish', () => {
            fileStream.close();
            console.log('Download finished')
        });
    })
}

Per eseguire la funzione, chiamala e passa l’URL del file che desideri scaricare:

downloadFile([file url]);

Per eseguire lo script, apri il tuo terminale e inserisci node seguito dal nome del file JavaScript:

node [script name]

Questo script scaricherà l’URL del file che hai passato alla funzione downloadFile() e lo salverà nella tua directory di lavoro.

Gestione degli errori durante il download dei file

In Node.js, durante il download dei file potrebbero verificarsi errori specifici come la scrittura nel flusso, una connessione scadente al servizio o problemi con il file stesso. È fondamentale registrare i messaggi di errore quando si verificano questi errori per poter affrontare il problema.

Prova/Prendi Blocco

Un blocco try-catch è una struttura di programmazione che consente di gestire potenziali errori ed eccezioni nel codice.

I blocchi try-and-catch costituiscono il blocco try…catch. Il codice del blocco try viene eseguito per primo e il codice del blocco catch viene eseguito se il blocco try genera un’eccezione.

try {
    downloadFile([file url]);
} catch (error) {
    console.log(error);
}

Utilizza un blocco try/catch per assicurarti di rilevare eventuali errori relativi al download. È quindi possibile gestire qualsiasi errore, se necessario, come registrarlo sulla console o ritentare il download.

Codice di stato della risposta HTTP

I codici di stato per le risposte HTTP mostrano se una particolare richiesta HTTP è stata eseguita correttamente.

Per esempio:

https.get(url, (res) => {
    const code = res.statusCode();
    console.log(code)
    const fileStream = fs.createWriteStream(filename);
});

Se la richiesta restituisce un codice di stato al di fuori dell’intervallo di successo, 200-299 , si è verificato un problema con la richiesta. Controllare il codice di stato HTTP, quindi cercare il significato del codice di stato per gestire l’errore se necessario.

Download di più file

È possibile scaricare più file contemporaneamente passando gli URL dei file come argomenti durante l’esecuzione di node [script name] . Per eseguire questa attività, è necessario modificare alcune parti dello script.

In JavaScript, gli argomenti passati insieme al comando node sono disponibili in process.argv, una proprietà dell’oggetto Node.js globale. Questa proprietà restituisce un array degli argomenti della riga di comando. Il primo elemento in questo array dovrebbe essere node , il comando effettivo che esegui. Il secondo sarà il nome del file dello script, quindi ogni argomento successivo dovrebbe essere un URL.

Per scaricare più file contemporaneamente, salvare l’array da process.argv in una variabile. Quindi esegui il metodo slice() per rimuovere i primi due elementi, che non sono URL:

const args = process.argv;
const urls = args.slice(2);

Il metodo slice() crea un nuovo array dagli elementi selezionati in un array. Questo metodo seleziona da un inizio specificato a una fine specificata (non inclusiva).

In questo caso, il passaggio di un valore pari a 2 rimuove il nome del comando del nodo e il nome del file dello script .

Infine, utilizzando il metodo map di JavaScript, passa ogni elemento nell’array urls a downloadFile() :

urls.map(url =>{
    downloadFile(url)
});

Per eseguire il codice, inserisci il comando node insieme al nome del tuo file JavaScript e agli URL che vuoi scaricare:

node [script name] url1 url2 url3

Utilizzo di una libreria di terze parti

Puoi anche scaricare file utilizzando una libreria di terze parti come il pacchetto di download npm .

All’interno della directory degli script, esegui il seguente comando npm per installare il pacchetto di download :

npm install download

Richiedi il pacchetto scaricato nel tuo script, quindi salva gli argomenti della riga di comando in un array:

const download = require('download');
const args = process.argv;
const urls = args.slice(2);

È ora possibile utilizzare la libreria di download per scaricare i file . Puoi farlo in diversi modi a seconda del tuo particolare obiettivo.

Per esempio:

async function downloadFile(urls){
await Promise.all(urls.map((url) => download(url, "files")))
};

downloadFile(urls);

Dichiara la funzione downloadFile come async e crea una promessa di attendere fino al completamento dell’attività specifica con la parola chiave await . Mappa l’ array urls alla funzione di download e passa il nome di una cartella locale , files , in questo caso, in cui archiviare i file.

Download di file nel file system locale

Le funzioni integrate di Node, come fs e https, semplificano la scrittura di un downloader di file. Per renderlo ancora più semplice, puoi utilizzare un modulo di terze parti come il download.

Entrambi i metodi consentono di scaricare file da un server remoto e salvarli nel file system locale. Dovresti scegliere il metodo migliore per le tue esigenze e utilizzarlo nella tua prossima applicazione Node.js.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *