Mudar o nome do arquivo a ser salvo no multer

Mudar o nome do arquivo a ser salvo no multer
Photo by Tigran Hambardzumyan / Unsplash

Uma maneira de solucionar o problema é renomear o arquivo a partir do ponto que já possui os dados do req.file, após ter passado no middleware do multer.

Toda essa configuração abaixo é feita apenas no backend (servidor) [nodejs].

A solução, de maneira resumida funciona assim:

  1. recebe um arquivo (multipart/form-data) no primeiro middleware (ali onde tem o upload.single)
  2. a partir do segundo middleware já possuo os dados para renomear o arquivo (os dados estão no objeto req.file) são os padrões do multer
  3. uso a lib nativa do nodejs fs para renomear o arquivo, através da função fs.renameSync
  4. Renomeia o arquivo através do valor da variável req.file.originalname.
  5. no servidor o arquivo estará no caminho relativo uploads/

Por exemplo: Um arquivo que tenha sido feito o upload vai possuir o nome no padrão do multer (para este passo eu não configurei o multer para nomear os arquivos. Dessa forma o arquivo que é enviado ao meu servidor (ao terminar o primeiro middleware (que é o do próprio multer), vai possuir o nome no seguinte padrão (2a39086031204b49df1b80322e9cd5ff), após isso, no segundo middleware (fileNameUploadRename) posso renomear o arquivo.

Veja um exemplo de implementação de um middleware que possui esta lógica:

const fs = require('fs');

const multer = require('multer');

const upload = multer({
    dest: 'uploads/'
});
router.post('/adicionarCurso', upload.single('certificado'), (req, res) => {
    try {
        fs.access(`${req.file.destination}${req.file.originalname}`, fs.constants.COPYFILE_EXCL, (err) => {
            if (err && err.errno === -2) {
                fs.renameSync(req.file.path, `${req.file.destination}/${req.file.originalname}`);
                res.status(200).json({ msg: 'Operação realizada com sucesso' });
                return;
            }
            res.status(409).json({ msg: 'O arquivo já existe' });
            fs.unlinkSync(req.file.path);
        })
    } catch (err) {
        res.status(500).json({
            err: "Houve um erro ao atualizar o certificado, tente novamente"
        })
    }
});

Para mais informações consulte a documentação do fs e valores das constantes do fs


Repare que no exemplo acima eu faço uso de algumas funções específicas da função `fs`. Por exemplo uso a constante `COPYFILE_EXCL` que fará operação de cópia falhar se o arquivo de destino já existir. Ou seja, não desejo sobre-escrever o arquivo. (O que vale é o primeiro a ser enviado), então eu recomendo que se deseja outro comportamento escolha a constante adequada para a sua situação.

Referências:

File system | Node.js v23.0.0 Documentation
File system | Node.js v23.0.0 Documentation