ASP .NET MVC 5 - Usando arquivos ZIP


Hoje veremos como tratar arquivos ZIP usando as classes do .NET Framework em aplicações ASP .NET MVC 5.

Desde a ASP.NET 4.5 podemos descompactar e compactar arquivos usando classes do Framework .NET. Não precisamos mais usar bibliotecas de terceiros.

O namespace System.IO.Compression contém os seguintes tipos para compactar e descompactar arquivos e streams: ZipFile, ZipArchive, ZipArchiveEntry , DeflateStream e GZipStream.

A classe ZipFile esta disponível a partir da versão 4.5 da plataforma .NET e veio para simplificar o tratamento de arquivos ZIP fornecendo métodos estáticos para criar, extrair e abrir esses arquivos.

Os métodos para manipular arquivos zip e seus arquivos são distribuídos entre três classes: ZipFile, ZipArchive e ZipArchiveEntry.

Para... Use...
Criar um arquivo zip de um diretório  ZipFile.CreateFromDirectory
Extrair o conteúdo de um arquivo zip para um diretório  ZipFile.ExtractToDirectory
Adicionar novos arquivos para um arquivo zip existente  ZipArchive.CreateEntry
Recuperar um arquivo em um arquivo zip  ZipArchive.GetEntry
Recuperar todos os arquivos em um arquivo zip  ZipArchive.Entries
Abrir um fluxo p/um arquivo individual contido num arquivo zip  ZipArchiveEntry.Open
Excluir um arquivo de um arquivo zip  ZipArchiveEntry.Delete

fonte: https://goo.gl/YYGqi3 acessado em outubro de 2010

Para usar a classe ZipFile classe, você deve incluir uma referência ao assembly System.IO.Compression.FileSystem em seu projeto

Hoje veremos como usar as classes do namespace System.IO.Compression para descompactar arquivos zip em uma aplicação ASP .NET MVC 5.

Recursos usados :

Criando um projeto ASP .NET MVC 5

Agora basta usar os recursos da biblioteca que temos referenciada no projeto.

Abra o VS 2017 Community e crie um projeto usando o template Web-> ASP .NET Web Application(.NET Framework) e informe o nome MvcZip;

A seguir marque o template MVC sem autenticação e clique em OK;

No projeto MVC criado inclua uma referência aos assemblies System.IO.Compreession e System.IO.Compression.FileSystem :

Crie uma pasta no projeto chamada Uploads para armazenar o conteúdo dos arquivos zip enviados para o servidor.

A seguir crie um novo controlador na pasta Controllers chamado ArquivosController.

Agora ajuste o arquivo _Layout.cshtml da pasta \Views\Shared para criar um link para a Action Index do controlador ArquivosController :

No Controlador ArquivosController vamos criar dois métodos Index:

1- Index (GET)

Agora vamos criar a view Index.cshtml que vai permitir enviar arquivos ZIP para o servidor.

Clique com o botão direito do mouse no método Action Index e selecione Add View;

Informe o nome Index e os valores conforme a figura abaixo:

Defina o código abaixo na view Index.cshtml criada na pasta \Views\Arquivos :

Neste código definimos um formulário que permite o usuário selecionar um arquivo para enviar para o servidor.

Ao escolher o arquivo e clicar no botão Submeter estamos usando o método POST para acionar o método Index do controlador ArquivosController que vai receber o arquivo arquivoZIP e realizar o tratamento do arquivo.

A seguir defina o código do método Index(POST) no controlador ArquivosController:

2 - Index (GET)

Entendendo o código:

1- obtemos o caminho da pasta uploads no servidor

 var uploads = Server.MapPath("~/uploads");

2- Verificamos se foi enviado um arquivo

if (arquivoZIP != null && arquivoZIP.ContentLength > 0)

3- Definimos as extensões permitidas e verificamos se o arquivo enviado possui uma das extensões permitidas. Se não possuir retornamos para a view exibindo uma mensagem de aviso:

var allowedExtensions = new[] { ".zip", ".rar" };
var checkextension = Path.GetExtension(arquivoZIP.FileName).ToLower();

if (!allowedExtensions.Contains(checkextension))
{
    ViewBag.Alerta = "Selecione um arquivo Zip or Rar menor que 20 ΜB";
    return View();
}

4- Se o arquivo enviado possui uma das extensões permitidas então o seu conteúdo será descompactado para a pasta uploads :

using (ZipArchive arquivo = new ZipArchive(arquivoZIP.InputStream))
{
   foreach (ZipArchiveEntry entrada in arquivo.Entries)
   {
      if (!string.IsNullOrEmpty(Path.GetExtension(entrada.FullName)))
      {
          entrada.ExtractToFile(Path.Combine(uploads, entrada.FullName));  
      }
      else
      {
         Directory.CreateDirectory(Path.Combine(uploads, entrada.FullName));
      }
    }
}

O método ExtractToFile (System.IO.Compression.FileSystem) extrai o conteúdo do arquivo ZIP para a pasta uploads.

Obs: No código do projeto eu comentei a linha de código que cria um diretório caso não seja um arquivo enviado.

Executando o projeto teremos o seguinte resultado:

Vemos no exemplo que os arquivos ZIP enviados são descompactados para a pasta uploads no servidor.

O projeto esta funcional mas pode enviar apenas arquivos pequenos ao servidor. Fique a vontade para incrementar o exemplo.

Na próxima parte do artigo veremos como criar um arquivo ZIP para download.

Pegue o projeto aqui :  MvcZip.zip

"Jesus respondeu: Na verdade, na verdade te digo que aquele que não nascer da água e do Espírito, não pode entrar no reino de Deus."
João 3:5

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

 

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

 

Referências:


José Carlos Macoratti