1
resposta

Fazer uploads de imagens usando multer e webpack

Estou tentando desenvolver uma aplicação que contem um cadastro de alunos, nesse cadastro terei a opção de fazer o upload de uma imagem do aluno, como não terei a opção de utilizar um serviço de webStorage como o S3 da Amazon, pensei que a melhor opção para este caso seria salvar as imagens em uma pasta da aplicação e salvar o caminho no banco, tentei usar o multer para fazer isso, e eu estou usando o webpack, mas não consegui fazer o multer salvar as imagens, alguém poderia me ajudar?

1 resposta

Fala aí Clovis, tudo bem? Para fazer isso você vai precisar do multer e NodeJS.

Para configurar o multer com Express, pode fazer o seguinte:

const DIRETORIO = "PASTA_PARA_SALVAR";

const multer = require("multer");
const upload = multer({dest : DIRETORIO});

app.set("upload", upload);

app.use(multer({dest : DIRETORIO}).any());

Basicamente estamos configurando o multer, passando onde ele deve salvar as imagens e dizendo para o Express usá-lo.

Agora, no controller, você pode fazer o seguinte:

const slug = require("slug");

upload : (req, res) => {
    req.files.forEach(file => {
        let nomeSlug = slug(file.originalname.substring(0, file.originalname.indexOf("."))).toLowerCase() + file.originalname.substring(file.originalname.indexOf("."))
        arquivo.create({
            nome : file.originalname,
            slug : nomeSlug,
        }).then(() => {
            fs.readFile(file.path, (erro, dados) => {
                if (erro) {
                    console.log(erro);
                    throw erro;
                }
                let destino = pathModule.join(file.destination, nomeSlug);
                let stream = fs.createWriteStream(destino);
                stream.write(dados);
                stream.end();
                fs.unlink(file.path);
            });
        }).catch(error => {
            console.log(error);
            res.status(500).json(error);
        });
    });
    res.status(201).end();
}

Primeiro cria um novo registro no MongoDB, o registro será inserido na collection de imagens com um nome e slug (para fazer o download).

Caso a criação deu certo, através do NodeJS é lido os arquivos enviados e salvos no servidor.

É mais ou menos essa a ideia, esse código é de um projeto antigo, mas atualmente não deve fugir muito disso.

Espero ter ajudado.