ASP .NET MVC -  Enviando arquivos para o servidor (VB .NET)


 Neste artigo vou mostrar como enviar arquivos para o servidor em  uma aplicação ASP .NET MVC usando a linguagem VB .NET.

Enviar arquivos para o servidor é uma tarefa rotineira e simples e existem muitos componentes que realizam esta tarefa.

Durante o processo de envio de arquivos ou upload, somente duas partes do modelo MVC interagem :  a view e o controller. Vamos examinar o processo passo a passo:

  1. Um usuário visita  uma página web e para enviar arquivos (a página aqui é representada pela view);
  2. Quando o upload é iniciado,  o componente que envia os arquivos empacota os arquivos em uma requisição POST e a envia para o servidor;
  3. A ASP.NET põe no cache todos os dados na memória do servidor ou no disco dependendo do tamanho dos arquivos enviados;
  4. A ASP.NET MVC define o controlador e o método Action apropriado que irá tratar a requisição;
  5. O método Action trata a requisição (salva no disco, no banco de dados, etc., através da propriedade Controller.Request  a qual obtém o objeto HttpPostedFilesBase para a requisição atual;
  6. A ASP.NET MVC envia uma resposta para o cliente através de Controller.Response;

Nota: A classe HttpPostedFilesBase serve como o classe base para classes que fornecem acesso a arquivos individuais que foram carregados por um cliente.

Podemos configurar as opções de upload definindo atributos no arquivo web.config se você desejar realizar alterações no servidor. Vejamos alguns destes atributos:

  1. maxRequestLength - o limite do tamanho do request em Kilobytes ( o valor padrão é 4096 KB)
  2. requestLengthDiskThreshold - o limite dos dados armazenados no buffer na memória do servidor em kilobyte ( o padrão é 80 KB)
  3. executionTimeout - o tempo de execução permitida para a requisição antes do seu encerramento ( o padrão é 110 segundos)

Todos esses atributos devem ser definidos na seção <httpRunttime>.

Vamos criar uma aplicação ASP .NET MVC para enviar arquivos para o servidor.

Recursos usados

Criando o projeto no VS Community

Abra o VS Community 2015  e clique em New Project;

A seguir selecione Visual Basic -> Web -> ASP .NET Web Application;

Informe o nome Mvc_Upload e clique no botão OK;

Selecione o template Empty e marque a opção MVC, sem autenticação, conforme figura a seguir:

Será criada uma solução com estrutura exibida abaixo:

Vamos criar no interior da pasta App_Data a pasta uploads onde iremos salvar os arquivos enviados.

Clique com o botão direito do mouse sobre a pasta App_Data e depois em Add -> New Folder e informe o nome uploads;

Criando o controlador UploadController

Clique com o botão direito do mouse sobre a pasta Controllers;

A seguir clique em Add -> Controller e selecione MVC5 Controller Empty e clique no botão Add;

Informe o nome UploadController e clique no botão Add;

O controlador será criado com o método Action Index() que irá tratar a requisição GET. Precisamos definir o método Index() que vai tratar o POST quando os arquivos forem enviados.

Inclua o código para o método Action Index() que vai tratar o POST no controller conforme mostrado a seguir:

Imports System.IO
Imports System.Web.Mvc
Namespace Controllers
    Public Class UploadController
        Inherits Controller
        Function Index() As ActionResult
            Return View()
        End Function
        <HttpPost>
        Public Function Index(file As HttpPostedFileBase) As ActionResult
            Try
                If file.ContentLength > 0 Then
                    Dim nomeArquivo = Path.GetFileName(file.FileName)
                    Dim caminho = Path.Combine(Server.MapPath("~/App_Data/uploads"), nomeArquivo )
                    file.SaveAs(caminho)
                    ViewData("Mensagem") = "Arquivo enviado e salvo com sucesso no servidor."
                End If
                Return View()
            Catch ex As Exception
                ViewData("Mensagem") = "Erro ao enviar arquivo : " & ex.Message
                Return View()
            End Try
        End Function

    End Class
End Namespace

Criando a View Index

Clique com o botão direito do mouse sobre o método Action Index e a seguir em Add View;

Aceite o nome Index e selecione o template : Empty, e clique no botão Add.

Será criado o arquivo Index.vbhtml no interior da pasta /Views/Upload.

A seguir inclua o código abaixo no arquivo Index.vbhtml:

<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Enviar Arquivos</title>
</head>
<body>
    <h1>Macoratti .net  - Upload de arquivos </h1>
    <hr />
    <div> 
        <form action="/Upload/Index" method="post" enctype="multipart/form-data">
            <label for="file">Nome do Arquivo :</label>
            <br />
            <input type="file" name="file" id="file" />
            <br />
            <input type="submit" />
            <p>
             @ViewData("Mensagem")
        </form>
    </div>
</body>
</html>

No formulário temos o método action acionando a Action Index do controlador Upload (/Upload/Index);

Usamos o atributo enctype que especifica como os dados do formulário devem ser codificados quando enviá-lo para o servidor. (Ele só pode ser usado com o método POST).

O valor "multipart/form-data" indica que nenhum caractere é codificado. Esse valor é necessário quando você estiver usando formulários que têm um controle para upload de arquivo.

A tag <input type="file".../>  cria um objeto de upload de arquivo com uma caixa de texto e o botão procurar.

Para concluir vamos alterar a rota definida no arquivo RouteConfig.vb na pasta App_Start conforme abaixo:

Assim, ao executar o projeto a Action Index do controlador UploadController será executada por padrão.

Agora é só alegria...

Executando o projeto e realizando alguns uploads teremos o seguinte resultado:

Este aplicativo é bem simples e permite que você transfira os arquivos do usuário para o servidor, mas ele não se importa com a segurança.  O servidor pode ser comprometido por vírus ou outros dados maliciosos enviados por alguém.

Assim, em uma aplicação mais robusta, você deve considerar adicionar algumas restrições de carregamento de arquivo no controlador, como por exemplo verificar a extensão do arquivo. Segue um exemplo abaixo que só permite arquivos com extensão .jpg e .png.

Dim arquivo As HttpPostedFileBase = Request.Files.[Get](0)
Dim extensaoPermitida = New String() {".jpeg", ".png"}
Dim extensao As String = Path.GetExtension(arquivo .FileName)


If extensaoPermitida .Contains(extensao ) Then
    // tratamento
Else
    // tratamento
End If

Pegue o projeto aqui : Mvc_Upload.zip (sem as referências)

Porque há um só Deus, e um só Mediador entre Deus e os homens, Jesus Cristo homem.
1 Timóteo 2: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 ?

Referências:


José Carlos Macoratti