Atualizado: 02/01/2025

Carregando Arquivos com Multer - Node.js

Uma das tarefas mais comuns em Node.js é carregar arquivos no servidor. Embora Node.js não possua ferramentas nativas para isso, podemos utilizar pacotes adicionais especializados. Um dos pacotes populares para essa finalidade é o Multer, que funciona sobre o Express.

Vamos criar um novo projeto para carregar arquivos. Instalamos os pacotes:

npm install express multer

Em seguida, defina um novo arquivo chamado index.html no projeto, que conterá o formulário para upload de arquivos:

<!DOCTYPE html>
<html>
<head>
    <title>Node.js</title>
    <meta charset="utf-8" />
</head>
<body>
    <h1>Upload de Arquivo</h1>
    <form action="/upload" method="post" enctype="multipart/form-data">
        <label>Arquivo</label><br>
        <input type="file" name="filedata" /><br><br>
        <input type="submit" value="Enviar" />
        </form>
</body>
<html>

É importante observar que, para que o Multer no servidor consiga processar o arquivo carregado, o atributo enctype do formulário deve ter o valor multipart/form-data.

No arquivo principal da aplicação app.js, vamos utilizar o Multer para processar o arquivo enviado:

const express = require("express");
    const multer  = require("multer");
    
    const app = express();
    
    app.use(express.static(__dirname));
    app.use(multer({dest:"uploads"}).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 na porta 3000"));

Nesse exemplo, o Multer é adicionado como um middleware. Na função multer, passamos um objeto de configuração, onde o parâmetro dest indica o caminho onde o arquivo será armazenado, que, neste caso, é a pasta uploads:

multer({dest:"uploads"}).single("filedata")

Se essa pasta não existir no projeto, ela será criada automaticamente.

A função single() especifica que apenas um arquivo será carregado. No formulário do index.html, temos um campo para carregar um único arquivo. O nome do campo no formulário é filedata, por isso passamos esse valor para a função single().

Após configurar o Multer, podemos acessar o arquivo carregado através de req.file ao processar a solicitação.

Para testar a aplicação, inicie-o, acesse a página index.html e carregue um arquivo:

Carregando um arquivo em Node.js

Depois disso, no console, veremos algo como:

{ 
    fieldname: 'filedata',
    originalname: 'ebook.pdf',
    encoding: '7bit',
    mimetype: 'application/pdf',
    destination: 'uploads',
    filename: '9bd3bdfd59e5e4b4c8527a1ee6f665da',
    path: 'uploads\\9bd3bdfd59e5e4b4c8527a1ee6f665da',
    size: 740735 
}

Aqui, podemos ver os metadados que o servidor recebe ao carregar o arquivo, os quais podemos utilizar conforme necessário.

Como resultado, a pasta uploads será criada no projeto, onde encontraremos o arquivo carregado:

.
├── app.js
├── index.html
├── uploads
│   └── 9bd3bdfd59e5e4b4c8527a1ee6f665da
└── node_modules

Vale destacar, que não é obrigatório configurar o Multer globalmente como um middleware para todas as solicitações. Podemos definir o uso do Multer apenas para funções específicas de tratamento de solicitações. Por exemplo:

const express = require("express");
const multer  = require("multer");

const app = express();

const upload = multer({dest:"uploads"});
app.use(express.static(__dirname));

app.post("/upload", upload.single("filedata"), 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 na porta 3000"));

Neste exemplo, o Multer é configurado em uma variável chamada upload, que é passada como um middleware para a rota /upload.

Dessa forma, o Multer será aplicado apenas a essa rota, e não a todas as solicitações.

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