
Veja nesse artigo como criar um upload de imagem em um projeto configurado com TypeScript e Node.js. Para pularmos a etapa de configuração de um novo projeto TypeScript, eu subi no meu GitHub um com uma configuração básica no seguinte link: TypeScript-Standard.
Esse projeto contém três arquivos: index.ts com um console.log(), package.json: com a configuração inicial de um projeto e o tsconfig.json, arquivo de configuração do TypeScript.
Baixando os pacotes
Com o projeto clonado no seu computador, execute o seguinte comando para baixar os pacotes necessários para esse artigo:
npm install express multer --save
A execução do comando acima irá baixar o express para gerenciar as rotas e o multer para auxiliar no upload dos nossos arquivos.
Agora você precisa configurar o TypeScript. Para isso, execute o seguinte comando para baixar os seus @types:
npm install typescript @types/express @types/multer --save-dev
Criando a primeira Rota
Abra o seu arquivo index.ts e atualize ele com o código abaixo.
import * as express from 'express'
import * as multer from 'multer'
const app = express();
app.get('/', (req, res) => {
res.send('Hello World!');
})
app.listen(3000, function () {
console.log('listening on port 3000!');
});
Passando rapidamente pelo código acima, nós temos:
- Importação dos nossos modules multer e express.
- Criação de uma rota.
- Configuração da porta que o projeto irá escutar.
- Testando a Rota
Para testar a rota, atualize o seu arquivo package.json com o código abaixo:
"name": "tsnode-standard",
"version": "1.0.0",
"description": "",
"scripts": {
"prestart": "tsc",
"start": "node dist/index.js"
},
Agora execute npm start para criar o diretório dist, assim que ele for criado irá executar o comando node dist/index.js e rodar o projeto na porta 3000. Abra o endereço http://localhost:3000, caso tudo esteja OK, você verá a mensagem Hello World. Podemos ver esse retorno na imagem abaixo.

Criando rota de Upload
O seu próximo passo será configurar o multer. Para isso, crie um novo arquivo na raiz do seu projeto chamado upload.ts na raiz do seu projeto e atualize ele com o código abaixo:
import * as multer from "multer";
const storage = multer.diskStorage({
destination: function(req, file, cb) {
cb(null, "uploads/");
},
filename: function(req, file, cb) {
cb(null, file.originalname);
}
});
const uploads = multer({ storage: storage });
export default uploads ;
Vamos entender o código acima:
- 01: Estamos importando o multer, ele é uma biblioteca que nos permite trabalhar com multipart/form-data.
- 03 a 10: Estamos passando qual será o nosso filename e o diretório que iremos enviar os nossos arquivos.
Agora você precisa criar uma rota para o upload. Para isso, atualize o seu arquivo index.ts com o código abaixo.
import * as express from 'express'
import uploads from './upload'
const app = express();
app.get('/',(req,res) => {
res.send('Hello World');
})
app.post('/', uploads.single('avatar'), (req, res) => {
try {
res.send('Arquivo enviado com sucesso: ' + req.file.filename);
} catch (error) {
console.log(error);
}
})
app.listen(3000, () => console.log('listening on port 3000!'))
Passando pelo código acima, nós temos:
- 03: Importação do arquivo upload.ts
- 11 a 16: Adição de um middler na rota POST.
Agora, para testar o upload, crie um arquivo chamando index.html e atualize ele com o código abaixo:
<!DOCTYPE html>
<html>
<head>
<title>Page Title</title>
</head>
<body>
<form class="uploadForm" action="http://localhost:3000/" method="post" enctype="multipart/form-data">
<label class="control-label">Select File</label>
<input name="avatar" id="input-1" type="file" class="file">
<input type="submit" value="submit" />
</form>
</body>
</html>
Acima foi criada uma estrutura html com um formulário e um campo file para o upload. Geralmente eu utilizo o postman para esses testes HTTP nos meus artigos, mas nesse eu irei mostrar como retornar ele na rota Get.
Como iremos adicionar o arquivo .html no retorno da nossa rota Get, e lembrando que o nosso arquivo é transpilado para pasta dist. Precisaremos configurar para que toda vez que o comando npm start for executado, ele copie esse arquivo para pasta dist. Para isso, vamos precisar baixar um pacote chamado copyfile.
Execute o seguinte comando no seu terminal para baixar esse pacote:
npm install copyfiles --save-dev
Agora, para utilizar ele no projeto, precisaremos atualizar o nosso arquivo package.json com o seguinte trecho de código:
"scripts": {
"prestart": "tsc && copyfiles *.html dist/",
"start": "node dist/index.js"
}
Note que o prestart está concatenando o tsc com um novo comando para executar o pacote copyfiles.
Agora atualize novamente a sua rota GET com o código abaixo:
app.get('/',(req,res) => {
res.sendFile('index.html', { root: __dirname });
})
Em seguida, crie um novo diretório chamado uploads na raiz do seu projeto.

Testando o código
Para testar o código desenvolvido nesse artigo, execute o comando npm start e abra o endereço http://localhost:3000 em seu navegador. Podemos ver o resultado dessa implementação na imagem abaixo:

Com isso finalizamos o nosso passo a passo para o upload, espero que tenham gostado e até um próximo artigo!




