Multer jest węzłem.js middleware do obsługi multipart/form-data
, który jest używany głównie do przesyłania plików. Jest napisane na górze busboy dla maksymalnej wydajności.
Uwaga: Multer nie przetworzy żadnego formularza, który nie jest częścią wieloczęściową (multipart/form-data
).
instalacja
npm install --save multer
użycie
Multer dodaje obiekt body
i obiekt file
lub files
do obiektu request
. Obiekt body
zawiera wartości pól tekstowych formularza, obiekt file
lub files
zawiera pliki przesłane za pośrednictwem formularza.
podstawowy przykład użycia:
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})
w przypadku, gdy potrzebujesz obsłużyć formularz wieloczęściowy tylko tekstowy, możesz użyć metody .none()
, przykład:
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
informacje o pliku
każdy plik zawiera następujące informacje:
klucz | opis |
---|---|
fieldName |
Nazwa pola podana w formularzu |
originalName |
nazwa pliku na komputerze użytkownika (undefined jeśli klient nie podał nazwy pliku) |
size |
Rozmiar pliku w bajtach |
stream |
strumień pliku |
detectedMimeType |
wykrytego typu mime, lub null, jeśli nie udało nam się wykryć |
detectedFileExtension |
typowe rozszerzenie pliku dla plików wykrytego typu, lub pusty łańcuch, jeśli nie udało się wykryć (z wiodącym . , aby dopasować path.extname ) |
clientReportedMimeType |
typ mime zgłaszany przez Klienta za pomocą nagłówka Content-Type lub null1, jeśli nagłówek był nieobecny |
clientReportedFileExtension |
rozszerzenie przesłanego pliku (jak donosi path.extname ) |
1 obecnie zwraca text/plain
jeśli nagłówek jest nieobecny, jest to błąd, który zostanie naprawiony w wydaniu łatki. Nie polegaj na tym zachowaniu.
multer(opts)
Multer akceptuje obiekt options, oto opcje, które można przypisać do Multera.
klucz | opis |
---|---|
limits |
ograniczenia przesyłanych danych (pełny opis) |
.single(fieldname)
Akceptuj pojedynczy plik o nazwie fieldname
. Pojedynczy plik będzie przechowywany w req.file
.
.array(fieldname)
Akceptuj tablicę plików o nazwie fieldname
. Opcjonalnie błąd, jeśli przesyłanych jest więcej niż maxCount
plików. Tablica plików będzie przechowywana wreq.files
.
.fields(fields)
Akceptuj mieszankę plików, określoną przez fields
. Obiekt z tablicami plików będzie przechowywany w req.files
.
fields
powinna być tablicą obiektów z name
i opcjonalnie maxCount
.Przykład:
.none()
Akceptuj tylko pola tekstowe. Jeśli zostanie przesłany jakikolwiek plik, zostanie wyświetlony błąd z kodem „LIMIT_UNEXPECTED_FILE”. To jest to samo co Robienie upload.fields()
.
.any()
akceptuje wszystkie pliki, które przychodzą przez przewód. Tablica plików będzie przechowywana wreq.files
.
Ostrzeżenie: Upewnij się, że zawsze obsługujesz pliki przesłane przez użytkownika.Nigdy nie dodawaj multer jako globalnego oprogramowania pośredniczącego, ponieważ złośliwy użytkownik mógł przesyłać pliki do trasy, której nie przewidziałeś. Używaj tej funkcji tylko na routesgdzie obsługujesz przesłane pliki.
limits
obiekt określający limity wielkości następujących opcjonalnych właściwości. Multer przekazuje ten obiekt bezpośrednio do busboya, a szczegóły właściwości można znaleźć na stronie busboya.
dostępne są następujące limity:
klucz | opis | domyślny |
---|---|---|
fieldNameSize |
maksymalny rozmiar nazwy pola | '100B' |
fieldSize |
maksymalny rozmiar wartości pola | '8KB' |
fields |
Maksymalna liczba pól niezwiązanych z plikiem | 1000 |
fileSize |
maksymalny rozmiar pliku | '8MB' |
files |
Maksymalna liczba pól pliku | 10 |
headerPairs |
Maksymalna liczba nagłówków key = >pary wartości do parsowania | 2000 (tak samo jak http węzła) |
limity bajtów mogą być przekazywane jako Liczba lub jako ciąg znaków z odpowiednim prefiksem.
określenie limitów może pomóc w ochronie witryny przed atakami typu DoS (denial of service).
obsługa błędów
w przypadku napotkania błędu multer deleguje błąd do wyrażenia. Możesz odtworzyć ładną stronę błędu za pomocą standardowego sposobu ekspresowego.
jeśli chcesz wyłapać błędy specjalnie z multer, możesz samodzielnie wywołać funkcję themiddleware.
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 })})