Atualizado: 02/01/2025

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(). Essa função aceita um objeto com dois parâmetros, cada um representando uma função:

  • destination: Define o local onde os arquivos carregados serão salvos - neste caso, a pasta uploads.

  • filename: Define o nome dos arquivos carregados: neste caso, é utilizado o nome original do arquivo (file.originalname). Contudo, se necessário, outros métodos podem ser usados, como adicionar a data atual ao nome do arquivo:

    filename: function (req, file, callback) {
      callback(null, file.originalname + "-" + Date.now())
    }

Ambos os parâmetros recebem o objeto de solicitação req, a partir do qual podemos, se necessário, obter outros dados da solicitação e utilizá-los ao salvar o arquivo.

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 (o objeto da solicitação), file (o arquivo carregado) e a função 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, podemos verificar o tipo MIME do arquivo. Em seguida, a função callback() é chamada. Se o tipo MIME for adequado, ou seja, se quisermos salvar o arquivo, passamos true como segundo parâmetro para a função callback. Caso contrário, passamos o valor false.

Quando callback(null, false) é chamado, o multer não define o valor de req.file, ou seja, esse valor será igual a undefined. Podemos tratar essa situação ao receber a solicitação:

E para aplicar esse filtro, ele deve ser passado para o objeto multer através do parâmetro fileFilter:

app.use(multer({storage:storageConfig, fileFilter: fileFilter}).single("filedata"));
Política de Privacidade

Copyright © www.programicio.com Todos os direitos reservados

É proibida a reprodução do conteúdo desta página sem autorização prévia do autor.

Contato: programicio@gmail.com