Desenvolvimento

30 jan, 2018

TypeScript: Upload de imagens com Node.js

Publicidade
Upload de arquivos

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.

Diretório para upload de imagens

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:

Upload de imagem

 

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