Multer este un nod.JS middleware pentru manipularea multipart/form-data
, care este utilizat în principal pentru încărcarea fișierelor. Este scrispe partea de sus a busboy pentru eficiență maximă.
notă: Multer nu va procesa nici o formă care nu este multipart (multipart/form-data
).
instalare
npm install --save multer
utilizare
Multer adaugă un obiect body
și un obiect file
sau files
la obiectul request
. Obiectul body
conține valorile câmpurilor de text ale formularului, obiectul file
sau files
conține fișierele încărcate prin formular.
exemplu de utilizare de bază:
const multer = require('multer')const express = require('express')const app = express()const upload = multer()app.post('/profile', upload.single('avatar'), (req, res, next) => { // req.file is the `avatar` file // req.body will hold the text fields, if there were any})app.post('/photos/upload', upload.array('photos', 12), (req, res, next) => { // req.files is array of `photos` files // req.body will contain the text fields, if there were any})const cpUpload = upload.fields()app.post('/cool-profile', cpUpload, (req, res, next) => { // req.files is an object (String -> Array) where fieldname is the key, and the value is array of files // // e.g. // req.files -> File // req.files -> Array // // req.body will contain the text fields, if there were any})
în cazul în care trebuie să gestionați un formular multipart numai text, puteți utiliza metoda .none()
, exemplu:
const multer = require('multer')const express = require('express')const app = express()const upload = multer()app.post('/profile', upload.none(), (req, res, next) => { // req.body contains the text fields})
API
Informații fișier
fiecare fișier conține următoarele informații:
cheie | descriere |
---|---|
fieldName |
numele câmpului specificat în formular |
originalName |
numele fișierului de pe computerul utilizatorului (undefined dacă Niciun nume de fișier nu a fost furnizat de client) |
size |
Dimensiunea fișierului în octeți |
stream |
flux de fișier |
detectedMimeType |
tipul MIME detectat sau null dacă nu am reușit să detectăm |
detectedFileExtension |
extensia tipică de fișier pentru fișiere de tipul detectat sau șirul gol dacă nu am reușit să detectăm (cu conducerea . pentru a se potrivi path.extname ) |
clientReportedMimeType |
tipul mime raportat de client folosind Content-Type antet, sau null1 în cazul în care antetul a fost absent |
clientReportedFileExtension |
extensia fișierului încărcat (raportat de path.extname ) |
1 returnează în prezent text/plain
dacă antetul este absent, acesta este un bug și va fi remediat într-o versiune de patch-uri. Nu vă bazați pe acest comportament.
multer(opts)
Multer acceptă un obiect opțiuni, următoarele sunt opțiunile care pot trece la Multer.
cheie | descriere |
---|---|
limits |
limitele datelor încărcate (descriere completă) |
.single(fieldname)
acceptați un singur fișier cu numele fieldname
. Fișierul unic va fi stocatîn req.file
.
.array(fieldname)
acceptați o serie de fișiere, toate cu numele fieldname
. Opțional eroare ifmai mult de maxCount
fișierele sunt încărcate. Matricea de fișiere va fi stocată înreq.files
.
.fields(fields)
acceptați un amestec de fișiere, specificat de fields
. Un obiect cu matrice de fișiereva fi stocat în req.files
.
fields
ar trebui să fie o serie de obiecte cu name
și opțional un maxCount
.Exemplu:
.none()
acceptați numai câmpurile de text. Dacă se face o încărcare de fișiere, va fi emisă o eroare cu codul”LIMIT_UNEXPECTED_FILE”. Acest lucru este la fel ca a face upload.fields()
.
.any()
acceptă toate fișierele care vine peste sârmă. O serie de fișiere vor fi stocate înreq.files
.
avertisment: Asigurați-vă că gestionați întotdeauna fișierele pe care un utilizator le încarcă.Nu adăugați niciodată multer ca middleware global, deoarece un utilizator rău intenționat ar putea încărca fișiere pe o rută pe care nu ați anticipat-o. Utilizați această funcție numai pe routeswhere sunteți de manipulare fișierele încărcate.
limite
un obiect care specifică limitele de dimensiune ale următoarelor proprietăți opționale. Multer trece acest obiect direct în busboy, iar detaliile proprietăților pot fi găsite pe pagina busboy.
sunt disponibile următoarele limite:
cheie | descriere | implicit |
---|---|---|
fieldNameSize |
dimensiunea maximă a numelui câmpului | '100B' |
fieldSize |
dimensiunea maximă a valorii câmpului | '8KB' |
fields |
numărul maxim de câmpuri non-fișier | 1000 |
fileSize |
dimensiunea maximă a fișierului | '8MB' |
files |
numărul maxim de câmpuri de fișiere | 10 |
headerPairs |
numărul maxim de antet cheie = >perechi de valori pentru a analiza | 2000 (la fel ca http Node) |
limitele de octeți pot fi transmise fie ca număr, fie ca un șir cu un prefix adecvat.
specificarea limitelor vă poate ajuta să vă protejați site-ul împotriva atacurilor denial of service (DoS).
eroare de manipulare
atunci când se confruntă cu o eroare, multer va delega eroarea de a exprima. Putețiafișați o pagină de eroare frumoasă utilizând modul expres standard.
dacă doriți să prindeți erori în mod specific de la multer, puteți apelafuncția middleware de unul singur.
const upload = multer().single('avatar')app.post('/profile', (req, res) => { upload(req, res, (err) => { if (err) { // An error occurred when uploading return } // Everything went fine })})