Configurando o Multer - Node.js
Configuração dos Parâmetros
No tema anterior, ao carregar arquivos, o nome atribuído ao arquivo era gerado de forma aleatória. No entanto, pode ser que essa forma de nomeação não seja a mais adequada para nós, e queiramos ter controle sobre como os arquivos são nomeados. Nesse caso, podemos fazer uma configuração mais precisa do multer:
const express = require("express");
const multer = require("multer");
const app = express();
const storageConfig = multer.diskStorage({
destination: (req, file, callback) => {
callback(null, "uploads");
},
filename: (req, file, callback) => {
callback(null, file.originalname);
}
});
app.use(express.static(__dirname));
app.use(multer({storage:storageConfig}).single("filedata"));
app.post("/upload", function (req, res, next) {
let filedata = req.file;
if (!filedata)
res.send("Erro ao carregar o arquivo");
else
res.send("Arquivo carregado com sucesso");
});
app.listen(3000, () => console.log("Servidor iniciado"));
Para configurar o multer de forma mais precisa, utilizamos a função multer.diskStorage()
: Define o local onde os arquivos carregados serão salvos - neste caso, a pastadestination
.uploads
: Define o nome dos arquivos carregados: neste caso, é utilizado o nome original do arquivo (filename
). Contudo, se necessário, outros métodos podem ser usados, como adicionar a data atual ao nome do arquivo:file.originalname
filename: function (req, file, callback) { callback(null, file.originalname + "-" + Date.now()) }
Ambos os parâmetros recebem o objeto de solicitação req
Em seguida, precisamos definir o parâmetro de armazenamento:
app.use(multer({storage:storageConfig}).single("filedata"));
Filtrando Arquivos
Ao salvar arquivos, pode haver a necessidade de filtrá-los por tipo. Talvez precisemos aceitar apenas arquivos de imagem, arquivos PDF ou outros tipos específicos de arquivos. Nesse caso, podemos definir um filtro. Por exemplo, vamos aceitar apenas arquivos de imagem:
const express = require("express");
const multer = require("multer");
const app = express();
const storageConfig = multer.diskStorage({
destination: (req, file, callback) => {
callback(null, "uploads");
},
filename: (req, file, callback) => {
callback(null, file.originalname);
}
});
// definição do filtro
const fileFilter = (req, file, callback) => {
if(file.mimetype === "image/png" ||
file.mimetype === "image/jpg"||
file.mimetype === "image/jpeg") {
callback(null, true);
}
else {
callback(null, false);
}
}
app.use(express.static(__dirname));
app.use(multer({storage:storageConfig, fileFilter: fileFilter}).single("filedata"));
app.post("/upload", function (req, res, next) {
let filedata = req.file;
console.log(filedata);
if (!filedata)
res.send("Erro ao carregar o arquivo");
else
res.send("Arquivo carregado com sucesso");
});
app.listen(3000, () => console.log("Servidor iniciado"));
O filtro basicamente é uma função que recebe três parâmetros: req
file
callback()
const fileFilter = (req, file, callback) => {
if(file.mimetype === "image/png" ||
file.mimetype === "image/jpg"||
file.mimetype === "image/jpeg") {
callback(null, true);
}
else {
callback(null, false);
}
}
Utilizando o valor de file.mimetype
callback()
true
callback
false
Quando callback(null, false)
req.file
undefined
E para aplicar esse filtro, ele deve ser passado para o objeto multer
fileFilter
app.use(multer({storage:storageConfig, fileFilter: fileFilter}).single("filedata"));