Upload e importação de arquivos grandes - Banco de dados

Nesta aula iremos fazer o upload de arquivo, criar um modelo onde irá armazenar o caminho do arquivo e outro modelo para receber as linhas da importação. Tudo utilizando o serviço da AWS Cloud.

assinaturaAssine nossa Comunidade

Aplicação Web MVC C# - Importação de arquivos grandes

O objetivo da aula de hoje é criar um servidor de Assets para enviar arquivos e colocar esse job diretamente em um servidor dedicado. Portanto iremos fazer a conexão com o banco de dados e o upload de arquivo.

O próximo passo das outras aulas será o processamento do arquivo.

Criar serviço RDS na AWS

No menu Serviços, buscar RDS que é um servidor de banco de dados gerenciado. Através do RDS vamos criar o banco de dados para começar a fezer seus programas na nuvem:

  • Vamos criar uma nova instâcia clicando em Create Database;
  • Microsoft Sql Server;
  • Selecione algumas especificações db details, como tipo de máquina,quanto de memória ram terá, qual o Time Zone, quanto em GB será alocado em espaço em disco e o nome da instância, que neste caso o nome será upload-lote
  • Nome do Usuário;
  • Password;
  • Em configurações avançadas,selecionar tipo de acesso público,acesso via host;
  • Clicar em ok para gerar a instância.

Vamos criar um formulário para fazer o upload do arquivo:

      
       @{
         ViewBag.Title = "Upload";
         
       }
      < div class = "jumbotron">
        < h1>Upload de arquivos em lote < /h1>
        < form method="post" action="/upload" id="form1" enctype="multipart/form-data">
          < input type="file" name="arquivo" id="arquivo" >
          < input type="submit" value="upload">
        < /form>
      < /div>
    
    

Criaremos as rotas Upload e UploadSucesso

      
        namespace TesteDeploy 
        {
          public class RouteConfig 
          {
            public static void RegisterRoutes(RouteCollection routes)
            {
              routes.MapRoute(
                "upload",
                "upload/sucesso",
                new { controller = "Home", action = "UploadSucesso" }
              );
              routes.MapRoute(
                "upload",
                "upload",
                new { controller = "Home", action = "Upload" }
              );
            }
          }
        }
       
    

Iremos fazer o upload de arquivo. Vamos fazer o request dos dados:

  • Obtemos o índice zero deste arquivo;
  • Definimos o path, que é o local onde iremos armazenar os arquivos, pasta Uploads.
  • Obter o path e combinar o upload junto com o arquivo que estamos obtendo, para que possa enviar com o caminho correto;
  • Salvamos o arquivo, para guardar o arquivo no nosso diretório;
  • Redirecionar para uma tela de upload sucesso.
      
        namespace MVC_GerenciadorDeConteudo.Controllers
        {
          public class HomeController : Controller 
          {
            public ActionResult Index()
            {
              return View();
            }
            
            public ActionResult Upload()
            {
              HttpPostedFileBase arquivo = Request.Files[0];
              if (arquivo.ContentLength > 0)
              {
                var uploadPath = Server.MapPath("~/COntent/Uploads");
                string caminhoArquivo = Path.COmbine(@uploadPath, Path.GetFileName(arquivo.FileName));
                arquivo.SaveAs(caminhoArquivo);
              }
              ViewData["Messege"] = "Arquivo Salvo com sucesso. logo estaremos processando";

              return RedirectToAction("UploadSucesso");
            }
            
            public ActionResult UploadSucesso()
            {
              return View();
            }
  
          }
        }
       
    
      
        @{
          viewBag.Title = "Upload"
        }
        < h2> Upload de arquivo feito com sucesso por favor aguarde o processamento< /h2>
        < h2> Para conferir a importação de arquivo clique < a href="/Home/Registros"> aqui  < /a>< /h2>
      
    

Vamos inserir uma table html para mostrar os dados que foram importados.Criaremos também um arquivo com extensão .csv, com campos separdos por ponto e virgula, e é este arquivo que será processado.

      
        nome;telefone;cpf  
        danilo;11976144154;44490400494
      
    
      
       @{
         ViewBag.Title = "Upload";
         
       }
       < table class="table">
        < thead>
          < tr>
            < th scope="col">#< /th>
            < th scope="col">Caminho< /th>
            < th scope="col">Data < /th>
            < th scope="col">Processado< /th>
          < /tr>
        < /thead>
        < tbody>
          < tr>
            < th scope="row">@ar.id< /th>
            < td>@ar.Caminho< /td>
            < td>@ar.Data< /td>
            < td>@ar.Processado< /td>
          < /tr>
        < /body>
      < /table>
    
    

Conexão com a base de dados RDS na AWS

Vamos fazer a conexão com a base de dados na AWS.

  • Em menu RDS > Databases clicar na instância que criamos na aula passada, chamada upload-lote;
  • Clicar em configuração > connectivy & security, podemos obter o endpoint que iremos fazer a conexão com o banco de dados.
  • Iremos copiar a url, abrir o Microsoft managment SqlServer;
  • Clicar em conectar a um banco de dados;
  • Colar a conexão que copiamos da AWS, entrar com usuario e senha;
  • Clicar em Conectar.

Agora vamos abrir o banco de dados e criar a tabela de importação chamada Arquivo.

Tabela Arquivo

Nome da Coluna Tipo de Dados
Id int - autoIncrement - Chave Primária
Caminho varchar(255)
Data Datetime
Processado tinyint

Criar outra tabela chamada Cliente.

Tabela Cliente

Nome da Coluna Tipo de Dados
Id int - autoIncrement - Chave Primária
Nome varchar(50)
Telefone varchar(50)
CPF varchar(50)
IdArquivo int
    Relacionamento da Tabela Arquivo
    • Com Cliente
      Tabela de Chaves Primarias Tabela de chaves estrangeiras
      Arquivo Cliente
      Id IdArquivo

Criar projeto Class Library

Vamos criar outro projeto que se relacionará com as aplicações TesteDeploy(web) e BackgroundMode(desktop).

Esta aplicação será uma Library, que o serviço de relacionamento entre as aplicações.

  • Clicar com o botão direito do mouse na Solução do projeto;
  • Clicar em Adicionar > Novo Projeto > Biblioteca de Classe;
  • Nomear o projeto para Database;
  • Clicar em ok.

DbContext Entity Framework

Criaremos o contexto UploadDB e com isso serão criadas duas classes referente as tabelas que fizemos no banco de dados.

Vamos Instalar o Entity Framework e criar o contexto.

  • Clicar com o botão direito no projeto Database;
  • Code first Database;
  • Selecionar menu Dados;
  • Selecionar a opção ADONET Entity Data Model;
  • Nomear para UploadDb;
  • New conection;
  • Conectar om o servidor da AWS.
  • Testar a conexão;
  • Selecionar a base de dados e clicar em avançar;
  • Selecionar todas as tabelas.

Em referências do projeto TesteDeploy e BackgroundMode, vamos fazer a referência ao projeto Database e ao Entity Framework.

Gravar as informações do upload no banco de dados

Vamos gravar as informações que fizemos do upload, no banco de dados local.

      
        namespace MVC_GerenciadorDeConteudo.Controllers
        {
          public class HomeController : Controller 
          {
            public ActionResult Upload()
            {
              HttpPostedFileBase arquivo = Request.Files[0];
              if (arquivo.ContentLength > 0)
              {
                var uploadPath = Server.MapPath("~/Content/Uploads");
                string caminhoArquivo = Path.Combine(@uploadPath, Path.GetFileName(arquivo.FileName));
                arquivo.SaveAs(caminhoArquivo);

                UploadDB db = new UploadDB();
                var modelArquivo = new Arquivo() { Caminho = caminhoArquivo, Data = DateTime.Now, Processado = 0 };
                db.Arquivo.Add(modelArquivo);
                db.SaveChanges();
                arquivo.SaveAs(caminhoArquivo);

              }

              return RedirectToAction("UploadSucesso");
            }
          }
        }
       
    

Na tela em que serão visualizados os arquivos, vamos armazenar a variável arquivos na ActionResult Registros na viewbag, que vai trazer a lista retornada da base de dados.

      
        namespace MVC_GerenciadorDeConteudo.Controllers
        {
          public class HomeController : Controller 
          {
            public ActionResult UploadSucesso()
            {
              return View();
            }

            public ActionResult Registros()
            {
              UploadDB db = new UploadDB();
              viewBag["arquivos"] = db.Arquivo.ToList();
              return View();
            }

          }
        }
       
    

Na View cshtml, vamos obter a informação da ViewBag da lista dos arquivos convertidos e fazer o foreach do objeto.

      
      @{
        ViewBag.Title = "Upload";
        var arquivos = (List< Database.Arquivo>)ViewBag.arquivos;
      }
      < table class="table">
        < thead>
          < tr>
            < th scope="col">#< /th>
            < th scope="col">Caminho< /th>
            < th scope="col">Data < /th>
            < th scope="col">Processado< /th>
          < /tr>
        < /thead>
        < tbody>
          @foreach(Database.Arquivo ar in arquivos) 
          {
            < tr>
              < th scope="row">@ar.id< /th>
              < td>@ar.Caminho< /td>
              < td>@ar.Data< /td>
              < td>@if(ar.Processado == 0){
                Não 
                }else{
                  Sim
                }
              < /td>
            < /tr>
          }
        < /body>
      < /table>
    
    

Será necessário incluir no arquivo App.Config de cada projeto, a tag de connectionString do banco de dados:

      
      < ?xml version="1.0" encoding="utf-8"?>
      < configuration>
        < connectionStrings>
          < add name="UploadDB" connectionString="data source=upload-lote.c8hdvjbqsag8.us-east-2.rds.amazonaws.com;initial catalog="uploadDb;" />
        < /connectionStringk>
      < /configuration > 
      
    

Fazer a publicação da aplicação

Vamos fazer a publicação do projeto TesteDeploy, para que seja gerado um arquvivo binário que será enviado para o servidor de produção.

  • Clicar com o botão direito do mouse no nome do projeto;
  • Selecionar Publicar...
  • Clicar no botão publicar.

Através do remote desktop vamos fazer a conexão com o servidor e copiar os arquivos para o servidor na pasta c:\inetpub

Upload e importação de arquivos grandes - Banco de dados

Nesta aula iremos fazer o upload de arquivo, criar um modelo onde irá armazenar o caminho do arquivo e outro modelo para receber as linhas da importação. Tudo utilizando o serviço da AWS Cloud.

Próximas Aulas:
assinaturaAssine nossa Comunidade

Aplicação Web MVC C# - Importação de arquivos grandes

O objetivo da aula de hoje é criar um servidor de Assets para enviar arquivos e colocar esse job diretamente em um servidor dedicado. Portanto iremos fazer a conexão com o banco de dados e o upload de arquivo.

O próximo passo das outras aulas será o processamento do arquivo.

Criar serviço RDS na AWS

No menu Serviços, buscar RDS que é um servidor de banco de dados gerenciado. Através do RDS vamos criar o banco de dados para começar a fezer seus programas na nuvem:

  • Vamos criar uma nova instâcia clicando em Create Database;
  • Microsoft Sql Server;
  • Selecione algumas especificações db details, como tipo de máquina,quanto de memória ram terá, qual o Time Zone, quanto em GB será alocado em espaço em disco e o nome da instância, que neste caso o nome será upload-lote
  • Nome do Usuário;
  • Password;
  • Em configurações avançadas,selecionar tipo de acesso público,acesso via host;
  • Clicar em ok para gerar a instância.

Vamos criar um formulário para fazer o upload do arquivo:

      
       @{
         ViewBag.Title = "Upload";
         
       }
      < div class = "jumbotron">
        < h1>Upload de arquivos em lote < /h1>
        < form method="post" action="/upload" id="form1" enctype="multipart/form-data">
          < input type="file" name="arquivo" id="arquivo" >
          < input type="submit" value="upload">
        < /form>
      < /div>
    
    

Criaremos as rotas Upload e UploadSucesso

      
        namespace TesteDeploy 
        {
          public class RouteConfig 
          {
            public static void RegisterRoutes(RouteCollection routes)
            {
              routes.MapRoute(
                "upload",
                "upload/sucesso",
                new { controller = "Home", action = "UploadSucesso" }
              );
              routes.MapRoute(
                "upload",
                "upload",
                new { controller = "Home", action = "Upload" }
              );
            }
          }
        }
       
    

Iremos fazer o upload de arquivo. Vamos fazer o request dos dados:

  • Obtemos o índice zero deste arquivo;
  • Definimos o path, que é o local onde iremos armazenar os arquivos, pasta Uploads.
  • Obter o path e combinar o upload junto com o arquivo que estamos obtendo, para que possa enviar com o caminho correto;
  • Salvamos o arquivo, para guardar o arquivo no nosso diretório;
  • Redirecionar para uma tela de upload sucesso.
      
        namespace MVC_GerenciadorDeConteudo.Controllers
        {
          public class HomeController : Controller 
          {
            public ActionResult Index()
            {
              return View();
            }
            
            public ActionResult Upload()
            {
              HttpPostedFileBase arquivo = Request.Files[0];
              if (arquivo.ContentLength > 0)
              {
                var uploadPath = Server.MapPath("~/COntent/Uploads");
                string caminhoArquivo = Path.COmbine(@uploadPath, Path.GetFileName(arquivo.FileName));
                arquivo.SaveAs(caminhoArquivo);
              }
              ViewData["Messege"] = "Arquivo Salvo com sucesso. logo estaremos processando";

              return RedirectToAction("UploadSucesso");
            }
            
            public ActionResult UploadSucesso()
            {
              return View();
            }
  
          }
        }
       
    
      
        @{
          viewBag.Title = "Upload"
        }
        < h2> Upload de arquivo feito com sucesso por favor aguarde o processamento< /h2>
        < h2> Para conferir a importação de arquivo clique < a href="/Home/Registros"> aqui  < /a>< /h2>
      
    

Vamos inserir uma table html para mostrar os dados que foram importados.Criaremos também um arquivo com extensão .csv, com campos separdos por ponto e virgula, e é este arquivo que será processado.

      
        nome;telefone;cpf  
        danilo;11976144154;44490400494
      
    
      
       @{
         ViewBag.Title = "Upload";
         
       }
       < table class="table">
        < thead>
          < tr>
            < th scope="col">#< /th>
            < th scope="col">Caminho< /th>
            < th scope="col">Data < /th>
            < th scope="col">Processado< /th>
          < /tr>
        < /thead>
        < tbody>
          < tr>
            < th scope="row">@ar.id< /th>
            < td>@ar.Caminho< /td>
            < td>@ar.Data< /td>
            < td>@ar.Processado< /td>
          < /tr>
        < /body>
      < /table>
    
    

Conexão com a base de dados RDS na AWS

Vamos fazer a conexão com a base de dados na AWS.

  • Em menu RDS > Databases clicar na instância que criamos na aula passada, chamada upload-lote;
  • Clicar em configuração > connectivy & security, podemos obter o endpoint que iremos fazer a conexão com o banco de dados.
  • Iremos copiar a url, abrir o Microsoft managment SqlServer;
  • Clicar em conectar a um banco de dados;
  • Colar a conexão que copiamos da AWS, entrar com usuario e senha;
  • Clicar em Conectar.

Agora vamos abrir o banco de dados e criar a tabela de importação chamada Arquivo.

Tabela Arquivo

Nome da Coluna Tipo de Dados
Id int - autoIncrement - Chave Primária
Caminho varchar(255)
Data Datetime
Processado tinyint

Criar outra tabela chamada Cliente.

Tabela Cliente

Nome da Coluna Tipo de Dados
Id int - autoIncrement - Chave Primária
Nome varchar(50)
Telefone varchar(50)
CPF varchar(50)
IdArquivo int
    Relacionamento da Tabela Arquivo
    • Com Cliente
      Tabela de Chaves Primarias Tabela de chaves estrangeiras
      Arquivo Cliente
      Id IdArquivo

Criar projeto Class Library

Vamos criar outro projeto que se relacionará com as aplicações TesteDeploy(web) e BackgroundMode(desktop).

Esta aplicação será uma Library, que o serviço de relacionamento entre as aplicações.

  • Clicar com o botão direito do mouse na Solução do projeto;
  • Clicar em Adicionar > Novo Projeto > Biblioteca de Classe;
  • Nomear o projeto para Database;
  • Clicar em ok.

DbContext Entity Framework

Criaremos o contexto UploadDB e com isso serão criadas duas classes referente as tabelas que fizemos no banco de dados.

Vamos Instalar o Entity Framework e criar o contexto.

  • Clicar com o botão direito no projeto Database;
  • Code first Database;
  • Selecionar menu Dados;
  • Selecionar a opção ADONET Entity Data Model;
  • Nomear para UploadDb;
  • New conection;
  • Conectar om o servidor da AWS.
  • Testar a conexão;
  • Selecionar a base de dados e clicar em avançar;
  • Selecionar todas as tabelas.

Em referências do projeto TesteDeploy e BackgroundMode, vamos fazer a referência ao projeto Database e ao Entity Framework.

Gravar as informações do upload no banco de dados

Vamos gravar as informações que fizemos do upload, no banco de dados local.

      
        namespace MVC_GerenciadorDeConteudo.Controllers
        {
          public class HomeController : Controller 
          {
            public ActionResult Upload()
            {
              HttpPostedFileBase arquivo = Request.Files[0];
              if (arquivo.ContentLength > 0)
              {
                var uploadPath = Server.MapPath("~/Content/Uploads");
                string caminhoArquivo = Path.Combine(@uploadPath, Path.GetFileName(arquivo.FileName));
                arquivo.SaveAs(caminhoArquivo);

                UploadDB db = new UploadDB();
                var modelArquivo = new Arquivo() { Caminho = caminhoArquivo, Data = DateTime.Now, Processado = 0 };
                db.Arquivo.Add(modelArquivo);
                db.SaveChanges();
                arquivo.SaveAs(caminhoArquivo);

              }

              return RedirectToAction("UploadSucesso");
            }
          }
        }
       
    

Na tela em que serão visualizados os arquivos, vamos armazenar a variável arquivos na ActionResult Registros na viewbag, que vai trazer a lista retornada da base de dados.

      
        namespace MVC_GerenciadorDeConteudo.Controllers
        {
          public class HomeController : Controller 
          {
            public ActionResult UploadSucesso()
            {
              return View();
            }

            public ActionResult Registros()
            {
              UploadDB db = new UploadDB();
              viewBag["arquivos"] = db.Arquivo.ToList();
              return View();
            }

          }
        }
       
    

Na View cshtml, vamos obter a informação da ViewBag da lista dos arquivos convertidos e fazer o foreach do objeto.

      
      @{
        ViewBag.Title = "Upload";
        var arquivos = (List< Database.Arquivo>)ViewBag.arquivos;
      }
      < table class="table">
        < thead>
          < tr>
            < th scope="col">#< /th>
            < th scope="col">Caminho< /th>
            < th scope="col">Data < /th>
            < th scope="col">Processado< /th>
          < /tr>
        < /thead>
        < tbody>
          @foreach(Database.Arquivo ar in arquivos) 
          {
            < tr>
              < th scope="row">@ar.id< /th>
              < td>@ar.Caminho< /td>
              < td>@ar.Data< /td>
              < td>@if(ar.Processado == 0){
                Não 
                }else{
                  Sim
                }
              < /td>
            < /tr>
          }
        < /body>
      < /table>
    
    

Será necessário incluir no arquivo App.Config de cada projeto, a tag de connectionString do banco de dados:

      
      < ?xml version="1.0" encoding="utf-8"?>
      < configuration>
        < connectionStrings>
          < add name="UploadDB" connectionString="data source=upload-lote.c8hdvjbqsag8.us-east-2.rds.amazonaws.com;initial catalog="uploadDb;" />
        < /connectionStringk>
      < /configuration > 
      
    

Fazer a publicação da aplicação

Vamos fazer a publicação do projeto TesteDeploy, para que seja gerado um arquvivo binário que será enviado para o servidor de produção.

  • Clicar com o botão direito do mouse no nome do projeto;
  • Selecionar Publicar...
  • Clicar no botão publicar.

Através do remote desktop vamos fazer a conexão com o servidor e copiar os arquivos para o servidor na pasta c:\inetpub