Node.js - Caricamento File: Una Guida per Principianti

Ciao هناك, futuro supercampione del coding! Benvenuto nel nostro emozionante viaggio nel mondo del caricamento dei file con Node.js. Come il tuo amico insegnante di computer del quartiere, sono entusiasta di guidarti in questa avventura. Non preoccuparti se non hai mai scritto una riga di codice prima - inizieremo da zero e costruiremo passo dopo passo. Alla fine di questo tutorial, sarai in grado di caricare file come un professionista!

Node.js - Upload Files

Introduzione al Caricamento dei File in Node.js

Prima di immergerci nei dettagli, parliamo dell'importanza del caricamento dei file. Immagina di creare un'app di social media dove gli utenti possono condividere foto. O forse stai costruendo un sistema di gestione dei documenti per un'azienda. In entrambi i casi, hai bisogno di un modo per gli utenti di inviare file al tuo server. Ecco dove entra in gioco il caricamento dei file!

Node.js, il nostro fedele runtime JavaScript, offre diversi modi per gestire il caricamento dei file. Oggi, ci concentreremo su due librerie popolari: Formidable e Multer. Pensa a queste come i tuoi supereroi del caricamento dei file, ognuno con i suoi poteri speciali!

Formidable: Il Tuo Primo Compagno di Caricamento dei File

Cos'è Formidable?

Formidable è come quell'amico affidabile che è sempre lì per aiutarti a spostare le cose. È un modulo Node.js che rende l'analisi dei dati delle form, specialmente il caricamento dei file, un gioco da ragazzi. Vediamo come usarlo!

Configurazione di Formidable

Prima di tutto, dobbiamo installare Formidable. Apri il tuo terminale e digita:

npm install formidable

Questo comando è come andare nel negozio di supereroi e prendere il tuo costume Formidable. Ora sei pronto per iniziare a caricare!

Caricamento di File di Base con Formidable

Creiamo un server semplice che può gestire il caricamento dei file. Ecco il codice:

const http = require('http');
const formidable = require('formidable');
const fs = require('fs');

http.createServer((req, res) => {
if (req.url == '/fileupload') {
const form = new formidable.IncomingForm();
form.parse(req, (err, fields, files) => {
const oldPath = files.filetoupload.filepath;
const newPath = 'C:/Users/YourName/uploads/' + files.filetoupload.originalFilename;
fs.rename(oldPath, newPath, (err) => {
if (err) throw err;
res.write('File caricato e spostato!');
res.end();
});
});
} else {
res.writeHead(200, {'Content-Type': 'text/html'});
res.write('<form action="fileupload" method="post" enctype="multipart/form-data">');
res.write('<input type="file" name="filetoupload"><br>');
res.write('<input type="submit">');
res.write('</form>');
return res.end();
}
}).listen(8080);

Ecco una spiegazione dettagliata:

  1. Creiamo un server usando http.createServer().
  2. Se l'URL è '/fileupload', usiamo Formidable per analizzare la form in arrivo.
  3. Spostiamo il file caricato dalla sua posizione temporanea a una permanente.
  4. Se l'URL è diverso, mostriamo una semplice form di caricamento.

Gestione del Caricamento di Più File

Cosa succede se vuoi caricare più file contemporaneamente? Nessun problema! Ecco come puoi modificare il codice:

const http = require('http');
const formidable = require('formidable');
const fs = require('fs');

http.createServer((req, res) => {
if (req.url == '/fileupload') {
const form = new formidable.IncomingForm();
form.multiples = true;
form.parse(req, (err, fields, files) => {
if (Array.isArray(files.filetoupload)) {
files.filetoupload.forEach((file) => {
const oldPath = file.filepath;
const newPath = 'C:/Users/YourName/uploads/' + file.originalFilename;
fs.rename(oldPath, newPath, (err) => {
if (err) throw err;
});
});
} else {
const oldPath = files.filetoupload.filepath;
const newPath = 'C:/Users/YourName/uploads/' + files.filetoupload.originalFilename;
fs.rename(oldPath, newPath, (err) => {
if (err) throw err;
});
}
res.write('Files caricati e spostati!');
res.end();
});
} else {
res.writeHead(200, {'Content-Type': 'text/html'});
res.write('<form action="fileupload" method="post" enctype="multipart/form-data">');
res.write('<input type="file" name="filetoupload" multiple><br>');
res.write('<input type="submit">');
res.write('</form>');
return res.end();
}
}).listen(8080);

Le principali modifiche qui sono:

  1. Impostiamo form.multiples = true per permettere il caricamento di più file.
  2. Controlliamo se files.filetoupload è un array (più file) o un oggetto (singolo file).
  3. Usiamo forEach per gestire più file se necessario.

Multer: Il Nuovo Arrivato in Città

Introduzione a Multer

Ora incontriamo il nostro secondo supereroe del caricamento dei file: Multer. Multer è come il fratello più giovane e cool di Formidable. È progettato specificamente per gestire multipart/form-data, che è perfetto per il caricamento dei file.

Configurazione di Multer

Per iniziare con Multer, installalo usando npm:

npm install multer

Caricamento di File di Base con Multer

Ecco un esempio semplice di come usare Multer:

const express = require('express');
const multer = require('multer');
const path = require('path');

const app = express();

const storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, 'uploads/')
},
filename: function (req, file, cb) {
cb(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname))
}
});

const upload = multer({ storage: storage });

app.get('/', (req, res) => {
res.sendFile(__dirname + '/index.html');
});

app.post('/upload', upload.single('filetoupload'), (req, res, next) => {
const file = req.file;
if (!file) {
const error = new Error('Please upload a file');
error.httpStatusCode = 400;
return next(error);
}
res.send(file);
});

app.listen(3000, () => console.log('Server started on port 3000'));

Ecco una spiegazione dettagliata:

  1. Configuriamo un motore di archiviazione che dice a Multer dove memorizzare i file e come chiamarli.
  2. Creiamo un'istanza di caricamento usando le nostre impostazioni di archiviazione.
  3. Definiamo una rotta per la form di caricamento e un'altra per gestire il caricamento del file.
  4. Nella rotta di caricamento, usiamo upload.single('filetoupload') per gestire un singolo caricamento di file.

Gestione del Caricamento di Più File con Multer

Multer rende facilissimo gestire il caricamento di più file. Ecco come:

app.post('/upload', upload.array('filetoupload', 12), (req, res, next) => {
const files = req.files;
if (!files) {
const error = new Error('Please choose files');
error.httpStatusCode = 400;
return next(error);
}
res.send(files);
});

La principale modifica qui è l'uso di upload.array('filetoupload', 12) invece di upload.single(). Il '12' specifica un massimo di 12 file.

Confronto tra Formidable e Multer

Ora che abbiamo visto entrambi Formidable e Multer in azione, confrontiamoli:

Caratteristica Formidable Multer
Facilità d'uso Semplice e intuitivo Richiede più configurazione ma offre più controllo
Integrazione Funziona con qualsiasi server Node.js Progettato per lavorare con Express
Gestione dei file Può gestire sia file che campi Progettato specificamente per il caricamento dei file
Personalizzazione Meno flessibile Altamente personalizzabile
Caricamento di più file Richiede codice aggiuntivo Supporto integrato

Conclusione

Complimenti! Hai appena migliorato le tue competenze Node.js imparando a gestire il caricamento dei file. Che tu scelga Formidable per la sua semplicità o Multer per la sua potenza e flessibilità, ora sei equipaggiato per aggiungere la funzionalità di caricamento dei file alle tue applicazioni Node.js.

Ricorda, la pratica rende perfetti. Prova a costruire un piccolo progetto che utilizza il caricamento dei file - magari una semplice app di condivisione di immagini o un sistema di archiviazione dei documenti. Più codici scrivi, più ti sentirai a tuo agio con questi concetti.

Buon codice, e possa i tuoi caricamenti sempre essere successful!

Credits: Image by storyset