Como realizar upload no S3 com NestJS \| TreinaWeb               Promoção no ar   Matricule-se agora e garanta **54% de desconto**  

  Termina em   Tempo restante da oferta: 03 Horas 

 55 Min 

 07 Seg 

   Tempo restante da oferta: 03 55 07 

  [Assinar →](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26) 

   [                ](https://www.treinaweb.com.br)  Explorar  

 [ Quanto custa? ](#assinatura) [ FAQ ](https://www.treinaweb.com.br#faq) [Matricule-se](#assinatura) [ Entrar ](https://www.treinaweb.com.br/login) 

     [ Início ](https://www.treinaweb.com.br) [ Artigos ](https://www.treinaweb.com.br/blog) Como realizar upload no S3 com NestJS  [ Node ](https://www.treinaweb.com.br/blog/categoria/node-js) [ Amazon ](https://www.treinaweb.com.br/blog/categoria/amazon) 

# Como realizar upload no S3 com NestJS

 Neste artigo vamos aprender o passo a passo de como realizar o upload de arquivos para a AWS S3 utilizando uma aplicação NestJS.

 [ Wesley Gado ](https://www.treinaweb.com.br/blog/autor/wesley-gado) 3 anos atrás

  ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/05/NEST-JS-UPLOAD-ARQUIVOS.png)  

No [artigo anterior,](https://www.treinaweb.com.br/blog/como-realizar-upload-de-arquivos-locais-no-nestjs) aprendemos a criar uma aplicação que realiza o upload de arquivos localmente. No entanto, em uma aplicação real, esses arquivos devem ser acessados de forma remota. Dessa forma, podemos utilizar vários serviços disponíveis de armazenamento de arquivos estáticos. Neste artigo, vamos aprender a utilizar um dos principais serviços dessa categoria: o S3 da Amazon. Caso você não tenha nenhum conhecimento sobre o S3, sugiro a leitura do artigo “[O que é AWS S3](https://www.treinaweb.com.br/blog/o-que-e-aws-s3)”, onde são explicadas com mais detalhes suas vantagens e limitações.

[  ![Node.js - Fundamentos](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/node-js.svg)   Curso Node.js - Fundamentos Conhecer o curso ](https://www.treinaweb.com.br/curso/nodejs-fundamentos)

## Criando conta na AWS S3

Agora vamos à prática. Precisamos fazer o cadastro no site https://aws.amazon.com/, vale ressaltar que logo na página inicial é possível obter informações sobre as ofertas e testes gratuitos. Para este artigo, iremos utilizar a oferta gratuita do S3.

![Página inicial da AWS](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/06/s3-1.png)

Ao acessar o site, vamos criar uma conta clicando em “Crie uma conta da AWS” no canto superior direito. Na próxima página, você deverá fornecer um endereço de e-mail para a conta e o nome da conta da AWS.

![Formulário de cadastro da AWS](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/06/s3-2.png)

Neste cadastro, a Amazon irá solicitar uma série de informações, incluindo a necessidade de um cartão de crédito, pois desta forma a Amazon faz a validação se é uma pessoa real que está se cadastrando. Entretanto, estaremos utilizando apenas a oferta gratuita e nada será cobrado do seu cartão, mas é sempre importante ficar atento a quaisquer cobranças que possam ocorrer e garantir que você esteja seguindo as limitações da oferta gratuita, pois essas regras podem mudar ao longo do tempo.

Após o cadastro, teremos acesso ao painel em que podemos pesquisar pelo nome do serviço na barra de pesquisa. Neste caso, pesquisaremos por S3 e, em seguida, clicaremos no resultado da busca.

![Localizando o S3 no painel da AWS](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/06/s3-3.png)

## Criando bucket

Agora devemos criar um bucket, é o termo utilizado pelo S3, basicamente é uma forma de definir e organizar os arquivos que serão armazenados no S3, podemos por exemplo ter vários buckets pra determinadas aplicações diferentes na mesma conta do S3.

![Criando um bucket no S3](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/06/s3-4.png)

No próximo passo, vamos configurar este novo bucket da seguinte maneira:

- **Nome do bucket**: neste campo, devemos inserir o nome do bucket, lembrando que ele deve ser único e exclusivo globalmente. Para este exemplo, vou criar com o nome “artigo-tw-s3”. No entanto, você deve criar outro nome, pois, como mencionado anteriormente, ele precisa ser exclusivo globalmente.
- **Região da AWS:** neste campo, vamos selecionar a região mais próxima. Como sou de São Paulo, vou selecionar a opção “América do Sul (São Paulo) sa-east-1”.
- **Configurações de bloqueio de acesso publico deste bucket**: Nessa opção, vamos permitir o acesso aos arquivos de forma pública. Para este exemplo, deixaremos os arquivos como públicos, pois poderão ser acessados por qualquer pessoa pela web, saliento que será público apenas para **leitura**. Também devemos selecionar o “checkbox” logo abaixo, na opção “Desativar bloqueio de todo acesso público…”.

![cadastro de novo bucket](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/06/cadastro-de-novo-bucket.png)

[  ![Nest.js - Fundamentos](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/nest-js.svg)   Curso Nest.js - Fundamentos Conhecer o curso ](https://www.treinaweb.com.br/curso/nestjs-fundamentos)

![Opção de bloqueio de bucket público](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/06/checkbox-acesso-publico-bucket.png)

As outras opções não precisam ser alteradas, vamos deixá-las como padrão. Enfim, o bucket será criado com sucesso:

![Lista de buckets no painel do S3](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/06/s3-5.png)

## Atualizando permissões do bucket

Precisamos atualizar as permissões do bucket para que qualquer pessoa possa acessar os arquivos, lembrando que neste exemplo os arquivos serão públicos. Para isso, vamos clicar no bucket ‘artigo-tw-s3’, em seguida, nas permissões, clicar em editar no item propriedades de objeto. Abrirá a seguinte tela, onde devemos habilitar as ACLs e selecionar a opção de proprietário do bucket preferida em propriedade do objeto:

![Configurando permissões do bucket](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/06/s3-6.png)

Lembre-se de clicar em salvar as alterações.

## Gerando chaves de acesso

Agora, devemos criar as chaves de acesso. Clique no menu com o nome da conta, localizado no canto superior direito, e em credenciais de segurança. Vamos em “Chaves de Acesso” e clique em criar chave de acesso. Aparecerá uma mensagem sobre chaves de acesso do usuário raiz. Selecione a caixa de seleção referente ao item “continuar a criar a chave de acesso?” e clique em criar chave de acesso:

![Criando chaves de acesso](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/06/s3-7.png)Obs: lembre-se de guardar as chaves em um local seguro, não será possível ter acesso a chave de acesso secreta novamente.

## Configurando aplicação NestJS para upload no S3

Agora, vamos configurar uma aplicação utilizando o [NestJS](https://www.treinaweb.com.br/blog/o-que-e-nestjs) para fazer o upload no S3. Para facilitar, vamos utilizar o projeto do artigo “[como realizar upload de arquivos locais no NestJS](https://www.treinaweb.com.br/blog/como-realizar-upload-de-arquivos-locais-no-nestjs)”. A aplicação também pode ser encontrada neste [repositório do GitHub](https://github.com/wesleygado/artigo-multer-nestjs).

Após configurar o projeto, vamos instalar o [multer-s3](https://github.com/anacronw/multer-s3) e o [SDK da AWS](https://github.com/aws/aws-sdk-js-v3 "SDK da AWS"):

```bash
npm install aws-sdk multer-s3 @types/multer-s3

```

Agora, no arquivo `multer-config.ts`, vamos fazer as alterações necessárias para salvar os arquivos no S3:

```tsx
//multer-config.ts
import * as multerS3 from 'multer-s3';
import { S3Client } from '@aws-sdk/client-s3';
import * as path from 'path';
import { v4 as uuidv4 } from 'uuid';

const s3Config = new S3Client({
  region: 'sa-east-1', //região selecionada na criação do bucket
  credentials: {
    accessKeyId: 'AKIAXTVE2Q4BYHIUN6UY', //chave de acesso
    secretAccessKey: 'chave de acesso secreta', //chave de acesso secreta
  },
});

const multerConfig = {
  storage: multerS3({
    s3: s3Config,
    bucket: 'artigo-tw-s3',
    contentType: multerS3.AUTO_CONTENT_TYPE,
    acl: 'public-read',
    key: (req, file, cb) => {
      const fileName =
        path.parse(file.originalname).name.replace(/\s/g, '') + '-' + uuidv4();

      const extension = path.parse(file.originalname).ext;
      cb(null, `${fileName}${extension}`);
    },
  }),
};

export default multerConfig;

```

Obs: tome cuidado com a exposição das chaves de acesso, elas não devem ser expostas por questões de segurança. Essas chaves do exemplo já estão inativas.

Observe que, primeiramente, criamos uma constante chamada s3Config com os dados do S3, que são a região selecionada ao criar o bucket e as credenciais (chave de acesso e chave secreta).

Em seguida, atualizamos a constante `multerConfig`, trocando o storage para multerS3 e passando as propriedades necessárias para a comunicação com o S3:

- **S3**: passamos as configurações através da constante s3Config;
- **bucket**: o nome do bucket criado na conta do S3;
- **contentType**: o content-type dos arquivos. No exemplo, utilizamos o AUTO\_CONTENT\_TYPE, onde o próprio multer identifica o [content-type](https://developer.mozilla.org/pt-BR/docs/Web/HTTP/Headers/Content-Type "content-type") do arquivo.
- **acl**: onde passamos as políticas de segurança e permissões do bucket. Neste caso, utilizamos o ‘public-read’, que significa que os dados podem ser lidos publicamente.
- **key**: propriedade onde definimos o nome do arquivo.

Ótimo, agora precisamos atualizar o arquivo `files.controller.ts`:

```tsx
//files.controller.ts
import {
  Controller,
  Post,
  UseInterceptors,
  UploadedFile,
  UploadedFiles,
} from '@nestjs/common';
import { FilesService } from './files.service';
import {
  FileFieldsInterceptor,
  FileInterceptor,
} from '@nestjs/platform-express';
import multerConfig from './multer-config';

@Controller('files')
export class FilesController {
  constructor(private readonly filesService: FilesService) {}

  @Post()
  @UseInterceptors(FileInterceptor('arquivo', multerConfig))
  uploadArquivo(@UploadedFile() file: Express.MulterS3.File) {
    console.log(file);
    return this.filesService.salvarDados(file);
  }

  @Post('varios')
  @UseInterceptors(FileFieldsInterceptor([{ name: 'arquivos' }], multerConfig))
  async uploadVariosArquivos(
    @UploadedFiles()
    files: Express.MulterS3.File[],
  ) {
    return await this.filesService.salvarVariosDados(files['arquivos']);
  }
}

```

Veja que atualizamos o tipo de `file` para `Express.MulterS3.File`, afinal, vamos utilizar as configurações do S3. Também eliminamos a utilização do objeto referente aos dados da requisição, já que não será mais necessário esses dados para criar a URL do arquivo. Essa URL será gerada pelo S3.

[  ![Nest.js - Templates com Handlebars](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/nest-js.svg)   Curso Nest.js - Templates com Handlebars Conhecer o curso ](https://www.treinaweb.com.br/curso/nestjs-templates-com-handlebars)

Por último, será necessário atualizar o arquivo `files.service.ts`, de acordo com as propriedades do S3:

```tsx
import { Injectable } from '@nestjs/common';
import { Repository } from 'typeorm';
import { InjectRepository } from '@nestjs/typeorm';
import { File } from './entities/file.entity';
import { Request } from 'express';

@Injectable()
export class FilesService {
  constructor(
    @InjectRepository(File)
    private fotoRepository: Repository,
  ) {}

  async salvarDados(file: Express.MulterS3.File) {
    const arquivo = new File();
    arquivo.fileName = file.key;
    arquivo.contentLength = file.size;
    arquivo.contentType = file.mimetype;
    arquivo.url = file.location;

    return await this.fotoRepository.save(arquivo);
  }

  async salvarVariosDados(files: Express.MulterS3.File[]) {
    const arrayArquivos = files.map((file) => {
      const arquivo = new File();
      arquivo.fileName = file.key;
      arquivo.contentLength = file.size;
      arquivo.contentType = file.mimetype;
      arquivo.url = file.location;
      return arquivo;
    });

    return await this.fotoRepository.save(arrayArquivos);
  }
}

```

Atualizamos o nome do arquivo para `file.key` e a URL para `file.location`. Dessa forma, os dados serão salvos corretamente no nosso banco de dados. Com essas configurações atualizadas, podemos testar e enviar os arquivos para o upload no S3:

![Testando rota de upload de arquivo único](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/06/s3-8.png)

Primeiramente, testamos a rota Files, que faz o upload de arquivos únicos, e obtivemos o retorno correto com os dados do arquivo e o código 201, ou seja, o upload foi efetuado com sucesso. Também podemos testar a rota files/varios, utilizada para fazer o upload de vários arquivos simultaneamente:

![Testando rota de arquivos simultâneos](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/06/s3-9.png)

Neste caso, realizamos o teste com dois arquivos ao mesmo tempo, sendo uma imagem e um PDF, também com sucesso. Podemos verificar em nossa base de dados se as informações dos arquivos foram salvas:

![Verificando dados salveos no banco de dados](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/06/s3-10.png)

Perfeito, os dados de ambos os arquivos foram salvos com sucesso.

Por fim, podemos visualizar os arquivos armazenados também no painel da AWS:

![Lista de arquivos no S3](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/06/s3-11.png)

## Conclusão

Neste artigo, aprendemos a fazer a integração de uma aplicação NestJS com o S3, um dos serviços de armazenamento de arquivos estáticos mais utilizados atualmente. Também utilizamos bibliotecas como o MulterS3 e o SDK da AWS, que auxiliam no desenvolvimento e nas configurações necessárias para essa integração.

Você pode consultar a aplicação de exemplo [neste repositório](https://github.com/wesleygado/artigo-nestjs-s3 "neste repositório").

Por fim, caso queira aprender mais sobre NestJS saiba que aqui na [TreinaWeb](https://treinaweb.com.br/) temos o curso [NestJS - Fundamentos](https://www.treinaweb.com.br/curso/nestjs-fundamentos) que possui **02h07 de vídeos** e um total de **18 exercícios**. Conheça também nossos outros cursos de [NestJS](https://www.treinaweb.com.br/cursos?q=nestsj).

Veja quais são os tópicos abordados durante o curso de NestJS - Fundamentos:

- Conhecendo a estrutura;
- Utilizando Nest CLI
- Entendendo Rotas, Controllers e Views;;
- Conexão com banco de dados;
- Usando TypeORM;
- Template Engine.

- [ #Amazon ](https://www.treinaweb.com.br/blog/tag/amazon)
- [ #S3 ](https://www.treinaweb.com.br/blog/tag/s3)
- [ #Node.js ](https://www.treinaweb.com.br/blog/tag/node-js)
- [ #NestJS ](https://www.treinaweb.com.br/blog/tag/nestjs)
- [ #multer ](https://www.treinaweb.com.br/blog/tag/multer)

Autor

 ![Wesley Gado](//secure.gravatar.com/avatar/1b770ca482a7232b1885881430a592bb?d=mm)

## Wesley Gado

 Formado em Análise e Desenvolvimento de Sistemas pelo Instituto Federal de São Paulo, atuou em projetos como desenvolvedor Front-End. Nas horas vagas grava Podcast e arrisca uns três acordes no violão. 

 [Todos os artigos](https://www.treinaweb.com.br/blog/autor/wesley-gado)  

## Continue estudando

 Transforme leitura em prática com os cursos e formações da TreinaWeb.

 [Ver cursos](https://www.treinaweb.com.br/cursos)   

  Continue lendo

## Artigos relacionados

- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/05/NEST-JS-UPLOAD-ARQUIVOS-400x280.png)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     3 anos atrás

    ##  [ Guia do framework NestJS ](https://www.treinaweb.com.br/blog/guia-do-framework-nestjs) 

     Neste guia do framework NestJS vamos fazer um compilado de tópicos úteis sobre o framework, desde criar um projeto básico até autenticação.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/05/NEST-JS-UPLOAD-ARQUIVOS-400x280.png)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     4 anos atrás

    ##  [ Como realizar upload de arquivos locais no NestJS ](https://www.treinaweb.com.br/blog/como-realizar-upload-de-arquivos-locais-no-nestjs) 

     Neste artigo vamos aprender a utilizar o recurso de upload de arquivos locais com o NestJS utilizando a biblioteca Multer do Express.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/05/24102227/laravel-request-400x280.png)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     8 anos atrás

    ##  [ Principais métodos para obtenção de parâmetros da Request no Laravel ](https://www.treinaweb.com.br/blog/principais-metodos-para-obtencao-de-parametros-da-request-no-laravel) 

     Aprenda nesse artigo como obter dados enviados na requisição. Veremos desde como pegar a instância da Request até métodos avançados para obtenção de parâmetros passados via GET, POST e como trabalhar com arquivos.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2018/11/28114609/GITHUB-STUDENTS-400x280.png)  [ Tecnologia ](https://www.treinaweb.com.br/blog/categoria/tecnologia) 

     8 anos atrás

    ##  [ Como obter uma licença para estudante no GitHub ](https://www.treinaweb.com.br/blog/como-obter-uma-licenca-para-estudante-no-github) 

     Neste artigo veremos como obter uma licença para estudante no GitHub.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/05/22213218/PRIMEIROS-PASSOS-GIT-400x280.png)  [ Controle de versão ](https://www.treinaweb.com.br/blog/categoria/controle-de-versao) 

     8 anos atrás

    ##  [ Primeiros passos com o Git ](https://www.treinaweb.com.br/blog/primeiros-passos-com-o-git) 

     Neste artigo veremos o que é Git e seus principais comandos.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2018/08/07161700/gerenciamento-python-400x280.png)  [ Python ](https://www.treinaweb.com.br/blog/categoria/python) 

     4 anos atrás

    ##  [ Empacotando e publicando pacotes Python no PyPi ](https://www.treinaweb.com.br/blog/empacotando-e-publicando-pacotes-python-no-pypi) 

     Neste artigo iremos aprender como funciona o processo de empacotar e distribuir nossos próprios pacotes Python no PyPi.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/02/maven-400x280.png)  [ Java ](https://www.treinaweb.com.br/blog/categoria/java) 

     6 anos atrás

    ##  [ Como instalar uma dependência com Maven e usar em seu projeto ](https://www.treinaweb.com.br/blog/como-instalar-uma-dependencia-com-maven-e-usar-em-seu-projeto) 

     Confira neste artigo como instalar uma dependência com Maven e usar em seu projeto.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/10/o-que-e-e-como-comecar-com-golang-400x280.jpg)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     4 anos atrás

    ##  [ Como instalar a Golang e executar nosso primeiro exemplo ](https://www.treinaweb.com.br/blog/como-instalar-a-golang-e-executar-nosso-primeiro-exemplo) 

     Neste artigo iremos aprender como instalar a Golang nos sistemas Windows, Linux e macOS e como executar nosso primeiro exemplo.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/11/PROFISSIONAL-TESTES-400x280.png)  [ Testes e Projetos ](https://www.treinaweb.com.br/blog/categoria/testes-e-projetos) 

     6 anos atrás

    ##  [ Como é o dia a dia de um profissional de teste? ](https://www.treinaweb.com.br/blog/como-e-o-dia-a-dia-de-um-profissional-de-teste) 

     O conhecimento técnico e a visão de negócio deste profissional também lhe permite colaborar no desenvolvimento do software. Saiba mais neste artigo!

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/09/10155418/recipes-symfony-400x280.png)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     7 anos atrás

    ##  [ Como criar recipes do Symfony Flex e enviar para o repositório ](https://www.treinaweb.com.br/blog/como-criar-recipes-do-symfony-flex-e-enviar-para-o-repositorio) 

     Aprenda a criar recipes do Symfony Flex personalizados para automatizar as configurações de bundles. Além disso, o post também mostra como enviar o recipe para o repositório e testar na prática.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/01/como-instalar-o-java-e-nosso-primeiro-exemplo-400x280.png)  [ Java ](https://www.treinaweb.com.br/blog/categoria/java) 

     6 anos atrás

    ##  [ Como instalar o Java e nosso primeiro exemplo ](https://www.treinaweb.com.br/blog/como-instalar-o-java-e-nosso-primeiro-exemplo) 

     Neste artigo veremos como instalar o Java nos sistemas Windows, Linux e MacOS, além disso vamos ver como escrever e executar nosso primeiro programa com a linguagem Java.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/01/29222037/PROJECT-BOARD-GITHUB-400x280.png)  [ Tecnologia ](https://www.treinaweb.com.br/blog/categoria/tecnologia) 

     7 anos atrás

    ##  [ Como criar um Project Board utilizando o GitHub ](https://www.treinaweb.com.br/blog/como-criar-um-project-board-utilizando-o-github) 

     Veja neste artigo como criar Project Boards para gerenciar seus projetos no GitHub.

     Ler artigo

## Um ano de acesso total para você viver de programação.

 Todos os cursos e formações da TreinaWeb numa única assinatura, com professores que atuam no mercado, suporte direto e certificados. Do primeiro `console.log` ao mercado de trabalho.

- **1 ano** de acesso a **todos os cursos**
- Cursos novos **toda semana**
- Suporte **direto com professores**
- Plano de carreira **personalizado**
- **Certificados digitais** inclusos
- **Aplicativos** para Android e iOS, com **acesso offline**

    **Garantia incondicional de satisfação** 

 Teste por 7 dias e, se não fizer sentido para você, devolvemos seu dinheiro.

### Acesso completo a todos os cursos e dezenas de Formações.

 12 meses 

  Economize R$ 840,00  54% OFF 

 de 12x R$ 129,00 por apenas

 12x  R$ 59,00

 sem juros no cartão de crédito ou R$ 599,00 à vista

  Oferta termina em  **03h 55min 07s**

- Acesso imediato e ilimitado durante 1 ano.
- Plano de carreira personalizado.
- Suporte direto com professores.
- E muito mais!

 [Matricule-se agora](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26)

     [                ](https://www.treinaweb.com.br)

 Escola online de programação, tecnologia e IA.

- [  ](https://www.facebook.com/TreinaWeb/)
- [  ](https://www.instagram.com/treinaweb/)
- [  ](https://www.youtube.com/user/TreinaWeb)
- [  ](https://twitter.com/treinaweb)
- [  ](https://www.linkedin.com/company/treinaweb)
- [  ](https://github.com/treinaweb)

## Inscreva-se em nossa newsletter

Receba lançamentos, promoções e novidades.

   Seu nome     Seu WhatsApp     Seu melhor e-mail   Inscrever-se 

## Cursos

- [ Base para Devs ](https://www.treinaweb.com.br/categoria/base-para-devs)
- [ Front-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-front-end)
- [ Back-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-back-end)
- [ Mobile ](https://www.treinaweb.com.br/categoria/desenvolvimento-mobile)
- [ Bancos de Dados ](https://www.treinaweb.com.br/categoria/bancos-de-dados)
- [ Cloud ](https://www.treinaweb.com.br/categoria/cloud-computing)
- [ IA ](https://www.treinaweb.com.br/categoria/ia)
- [ E mais ](https://www.treinaweb.com.br/categoria/e-mais)
- [ Ver todos os cursos ](https://www.treinaweb.com.br/cursos)

## Conteúdo

- [ Formações ](https://www.treinaweb.com.br/formacoes)
- [ Projetos práticos ](https://www.treinaweb.com.br/projetos-praticos)
- [ Direto ao ponto ](https://www.treinaweb.com.br/direto-ao-ponto)
- [ Planos ](https://www.treinaweb.com.br#assinatura)
- [ Depoimentos ](https://www.treinaweb.com.br#depoimentos)
- [ Comunidade ](https://www.treinaweb.com.br#comunidade)
- [ Corpo docente ](https://www.treinaweb.com.br#docente)

## A empresa

- [ Sobre a TreinaWeb ](https://www.treinaweb.com.br#sobre)
- [ Perguntas frequentes ](https://www.treinaweb.com.br#faq)
- [ Vantagens de estudar na TreinaWeb ](https://www.treinaweb.com.br/vantagens-de-estudar-na-treinaweb)
- [ Cursos para empresas ](https://www.treinaweb.com.br/empresas)
- [ Sugira um novo curso ](https://www.treinaweb.com.br/sugerir-curso)
- [ Trabalhe conosco ](https://www.treinaweb.com.br/trabalhe-conosco)
- [ Artigos ](https://www.treinaweb.com.br/blog)
- [ Desenvolvedores e agentes ](https://www.treinaweb.com.br/developers)
- [ Contato ](https://www.treinaweb.com.br/contato)
- [ Política de privacidade ](https://www.treinaweb.com.br/politica-de-privacidade)
- [ Termos de uso ](https://www.treinaweb.com.br/termos-de-uso)

## Baixe nosso aplicativo

 [   Disponível na **App Store**  ](https://apps.apple.com/us/app/treinaweb/id1322729447) [   Disponível no **Google Play**  ](https://play.google.com/store/apps/details?id=br.com.treinaweb.mobile) 

  Av. Paulista, 1765, Conj 71 e 72 · Bela Vista · São Paulo · SP · 01311-200   © 2004 – 2026 TreinaWeb Tecnologia LTDA · CNPJ 06.156.637/0001-58
