ASP.NET - Fazendo o Upload de arquivos


Para fazer um upload em ASP você tinha 2 opções :

  1. Usar um componente de terceiros - Ex : SA-FileUp ou ASPUpload
  2. Desenvolver você mesmo via código um componente ou um script para fazer o serviço.

A primeira opção envolvia custos extras pois você teria que pagar pelo componente , teria que registrar o componente no servidor , e isto poderia lhe trazer problemas. A segunda opção envolvia tempo pois você teria que desenvolver e testar o seu componente para ter certeza de que ele iria funcionar.

Com a ASP.NET isto é coisa do passado ; ASP.NET fornece o suporte a upload de arquivos sem a necessidade de componentes COM. Você tem a sua disposição a classe HtmlInputFile da .NET Framework e pode criar uma instância desta classe e usá-la em sua página ASP.NET  usando poucas linhas de código para fazer o upload de arquivos.

Preparando para fazer o Upload

Basicamente você vai precisar de duas coisas para fazer um upload em ASP.NET :

  1. Configurar o formulário HTML para permitir que o upload seja feito. Para isto você deve incluir o atributo ENCTYPE="Multipart/Form-Data" no formulário HTML

Ex: <form id="Form1" method="post" runat="server" enctype="multipart/form-data">

  1. Criar uma instância da classe HtmlInputFile . Você pode fazer isto usando o controle HTML do tipo file :

Ex: <input id="MeuArquivo" type="file" runat="server">

Nota : O controle HtmlInputFile pode usar os seguintes atributos:

Input
   Type="File"
   RunAt="Server"
   ID="Specify an ID"
   Accept="Specify MIMEencodings"
   MaxLength="Specify maximum length of file path"
   Size="Specify width of textbox of the control" >
 

Observe que estamos usando na tag a expressão runat="server" o que indica que este é um controle HTML do servidor do tipo file. Esta tag irá exibir na página uma caixa de teto com um botão para Procurar/Browse o arquivo na máquina local e ser enviado para o servidor.

Feito isto basta escrever algumas linhas de código e pronto seu serviço de envio de arquivos para o servidor esta pronto. Abaixo o código mínimo que faz isto:

<%@ import namespace="System" %> 
<%@ import namespace="System.Web" %> 

<script language="vb" runat="server" >

public sub page_load(s as object,e as eventargs)
    response.write("<h1>Upload com ASP.NET...</h1>")
end sub

public sub upload(s as object,e as eventargs)
dim s1 as string
dim s2 as string
dim pos as integer

s1=arquivo.postedfile.filename
pos=s1.lastindexof("\") +1
s2=s1.substring(pos) 
arquivo.postedfile.saveas ("d:\inetpub\wwwroot\upload\" & s2)

response.write("<h4>Nome arquivo      : " & arquivo.postedfile.filename & "</h4>")
response.write("<h4>Tamanho arquivo : " & arquivo.postedfile.contentlength & "</h4>")
response.write("<h4>Content Type      : " & arquivo.postedfile.contenttype & "</h4>")

end sub

</script>

<html>
<body bgcolor="aqua">
<%
if page.ispostback=false then
%>
<form runat="server" enctype="multipart/form-data">
<table>
<tr>
<td>Arquivo selecionado :</td>
<td><input type="file" id="arquivo" runat="server" /></td>
</tr>
<tr>
<class=tagname>
<td><asp:Button id="btn1" runat="server" text="Enviar" onclick="upload"/>
</td>
</tr>
</table>
</form>
<%
end if
%>

</body>
</html>

O código funciona assim :

- A tag - <input type="file" id="arquivo" runat="server" /> permite o upload de arquivos via página Web

- Foi definido o evento - upload - que será disparado quando o usuário clicar no botão - Enviar.

- No evento - upload - inserimos o código de script que usa as propriedades da classe : HtmlInputFile:

 Salvamos o arquivo na pasta d:\inetpub\wwwroot\upload\ do servidor :

arquivo.postedfile.saveas ("d:\inetpub\wwwroot\upload\" & s2)

O método - arquivo.PostedFile.SaveAs - recebe apenas um argumento :  o caminho e o nome do arquivo postado.

Exibimos informações sobre o arquivo enviado:

response.write("<h4>Nome arquivo      : " & arquivo.postedfile.filename & "</h4>")
response.write("<h4>Tamanho arquivo : " & arquivo.postedfile.contentlength & "</h4>")
response.write("<h4>Content Type      : " & arquivo.postedfile.contenttype & "</h4>")

Ao executar o código acima você obterá as seguintes páginas:

Página principal solicitando a seleção do arquivo a enviar Após selecionar o arquivo e clicar no botão - Enviar - teremos as informações sobre o arquivo.

Melhorando o seu Upload

Percebeu que não temos um tratamento de erros no código acima. E se o upload falhar ???? Vamos então dar uma melhorada no código incluindo o tratamento de erros e exibindo a  mensagem para o usuário que o arquivo foi enviado com sucesso ou que a operação falhou :

<html>
<script language="VB" runat="server">

Sub upload (Sender as Object, e as EventArgs)

Dim strNomeArquivo as string
strNomeArquivo = MyFile.PostedFile.FileName
Dim NomeArquivo as string = System.IO.Path.GetFileName(strNomeArquivo)

Try

    MyFile.PostedFile.SaveAs("d:\InetPub\wwwroot\upload\" + NomeArquivo)
    FileName.InnerHtml = MyFile.PostedFile.FileName
    FileContent.InnerHtml = MyFile.PostedFile.ContentType
    FileSize.InnerHtml = MyFile.PostedFile.ContentLength

    Mensagem.Visible = true

catch Exp as exception

    MensagemErro.Visible = true

End Try

End Sub
</Script>

<body bgcolor="aqua">

<form method="Post" enctype="Multipart/Form-Data" runat="Server">

Escolha um arquivo para enviar para o Servidor:<br>

<input id="MyFile" type="File" runat="Server" size="25">

<p></p>
<input type="Submit" value="Enviar" onserverclick="upload" runat="Server">
<P>

<asp:panel id="Mensagem" runat="server" Visible="False">Seu arquivo foi enviado com sucesso !.<p>
Nome do Arquivo      : <span id="FileName" runat="Server"/><br>
Conteudo do Arquivo : <span id="FileContent" runat="Server"/><br>
Tamanho do Arquivo  : <span id="FileSize" runat="Server"/>bytes<br>
</asp:panel>

<asp:panel id="MensagemErro" runat="server" Visible="False">Problemas no envio do arquivo !.</asp:panel>

</form>
</body>
</html>

O código acima é quase igual ao anterior . Adicionei apenas o tratamento de erros usando o Try/Catch e o controle panel para exibir mensagens para o usuário. Também estou obtendo o nome do arquivo usando o código abaixo :

Dim strNomeArquivo as string
strNomeArquivo = MyFile.PostedFile.FileName
Dim NomeArquivo as string = System.IO.Path.GetFileName(strNomeArquivo)

O final da execução irá gerar a seguinte página :


 

Então vou ficando por aqui até o próximo artigo ASP.NET...


José Carlos Macoratti