Mudar o nome do arquivo a ser salvo no multer
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:
- recebe um arquivo (multipart/form-data) no primeiro middleware (ali onde tem o
upload.single
) - 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 - uso a lib nativa do nodejs
fs
para renomear o arquivo, através da funçãofs.renameSync
- Renomeia o arquivo através do valor da variável
req.file.originalname
. - 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: