Deletado em 17 de agosto de 2009

Upload/Leitura de Arquivos no C#

Antes de continuarmos falando de camadas e padrões, vamos fazer alguns uploads e ler alguns arquivos nos diretórios.

Para isso vamos basicamente fazer uma galeria de imagens.

Nossa galeria de imagens terá a seguinte forma:

Onde teremos um objeto do tipo File Upload, um Text Box para darmos um nome para a imagem, um Button para enviar os dados, e um Label para mostrarmos as imagens.

Devemos importar:

using System.IO; using System.Text;

Nosso 1º passo será criar a ação do botão, que ficará da seguinte maneira:

protected void btnSalvar_Click(object sender, EventArgs e)
{
     if (VerificaDadosArquivo(fuArquivos, txtNome.Text))
     {
           try
           {
              SalvarArquivos(fuArquivos, txtNome.Text);
           }
           catch(Exception ex)
           {
              ClientScript.RegisterStartupScript(typeof(string), "Erro", "<script>alert('" + ex.Message + "')</script>");
           }
     }
}

Verificamos que temos dois métodos nessa chamada, o VerificaDadosArquivo que retorna um bool e o SalvarArquivo que é void.

O método VerificaDadosArquivo irá fazer a validação das informações enviadas e a validação dos arquivos que eu quero liberar para upload.

private bool VerificaDadosArquivo(FileUpload fuArquivos, string nome)
{
     if (fuArquivos.PostedFile == null || nome == string.Empty)
     {
            ClientScript.RegisterStartupScript(typeof(string), "Erro", "<script>alert('Preencha todos os dados')</script>");
            return false;
     }
     if (fuArquivos.PostedFile.ContentType.IndexOf("gif") < 0 && fuArquivos.PostedFile. ContentType.IndexOf("jpeg") < 0)
     {
            ClientScript.RegisterStartupScript(typeof(string), "Erro", "<script>alert('Escolha imagens tipo .gif ou .jpg')</script>");
            return false;
     }
     return true;
}

Na 1º validação é verificado se o usuário digitou todos os dados, na 2º validação é verificado se o arquivos que o usuário quer enviar é do tipo “gif” ou “jpeg”, verificamos no ContentType pois é mais seguro que apenas verificar a extensão do arquivo, já que a mesma pode ser alterada.

Passado pelas nossas validações o arquivo é salvo:

private void SalvarArquivo(FileUpload fuArquivos, string nome)
{
    string diretorio = ConfigurationManager.AppSettings["Diretorio"];
    DirectoryInfo infoDir = new DirectoryInfo(diretorio);

    if (!infoDir.Exists)
    {
        infoDir.Create();
    }

    FileInfo infoFile = new FileInfo(fuArquivos.PostedFile.FileName);
    fuArquivos.PostedFile.SaveAs(diretorio + nome + infoFile.Extension);

    ListarImagensDiretorio();
}

Neste método, falamos qual é o diretório que queremos salvar o arquivo, deixo na Web.Config para poder ser alterado a qualquer hora.

Depois disso, criamos uma variável do tipo DirectoryInfo para termos todas as informações do diretório que usaremos. Após, se ele não existir, é criado.

Outra variável é criada, uma variável do tipo FileInfo para agora termos as informações do arquivo que o usuário quer salvar.

Já sabemos que o arquivo é do tipo que queremos e está tudo certinho, então vamos salvar, no diretório criado, com o nome fornecido pelo usuário e a extensão correta.

Perfeito, o upload está pronto!

Precisamos agora listar as nossas imagens. Abaixo do texto de listar imagens, vamos ajustar o Label que tinhamos colocado.

No PageLoad e no Método SalvarArquivo vamos chamar o método ListarImagensDiretorio (como visto acima, no fim do método de Salvar):

protected void Page_Load(object sender, EventArgs e)
{
     if (!IsPostBack)
     {
         ListarImagensDiretorio();
     }           
}

O método é o seguinte:

private void ListarImagensDiretorio()
{
    string diretorio = ConfigurationManager.AppSettings["Diretorio"];
    string url = ConfigurationManager.AppSettings["URL"];
    StringBuilder oSbImages = new StringBuilder();
    bool hasFiles = false;
    DirectoryInfo oDirec = new DirectoryInfo(diretorio);

    oSbImages.Append("<div style='width:500px'>");

    foreach (FileInfo oFile in oDirec.GetFiles())
    {
         if (oFile.Extension.Equals(".gif") || oFile.Extension.Equals(".jpg"))
         {
               oSbImages.Append("<div class='imagens'>");
               oSbImages.Append("  <a href='" + url + oFile.Name + "' target='_blank'>");
               oSbImages.Append("      <img src='" + url + oFile.Name + "' width='85' height='52' border='0'><br>");
               oSbImages.Append("      <span class='titulo'>" + oFile.Name.Replace(oFile.Extension, string.Empty) + "</span>");
               oSbImages.Append("  </a>");
               oSbImages.Append("</div>");                                                       hasFiles = true;
          }
     }

     oSbImages.Append("</div>");

     if (hasFiles)
     {
          lblImagens.Text = oSbImages.ToString();
     }
     else
     {
          lblImagens.Text = "Nenhuma Imagem no Diretório.";
     }
 }

Vamos navegar neste método.

Primeiramente temos as declarações das variáveis: "diretorio" (Podemos também fazer apenas um MapPath da variável "url") com o conteúdo da Web.Config, "url" que será o caminho virtual para a pasta, uma variável StringBuilder para criarmos a lista de imagens, um bool para checarmos se existem imagens, e, por fim, uma variável do tipo DirectoryInfo que possui as informações do diretório.

OBS: Algumas dessas variáveis poderiam ser globais, mas como exemplificar assim fica mais fácil eu fiz dessa maneira.

Com minha StringBuilder eu crio umas frescurinhas para a apresentação das imagens.

No laço, para cada arquivo em meu diretório, se a extensão for .gif ou .jpg apresento a imagem. (Para não pegar arquivos como thumb.db)

OBS: No método GetFiles, eu poderia ter colocado para pegar apenas os gifs desta maneira GetFiles(“.gif”), porém como precisaremos pegar todos os .gif e .jpg não poderemos usar esse esquema.

No final do método, se existir um arquivo apresento a StringBuilder se não apresenta a mensagem.

Prontinho, rápido e sem dores... No caso sem odores já que jogamos no Lixo =)

Link para baixar o projeto. Está pesado pois mando junto as imagens!

Abraços pessoal! Bons estudos...

1 comentários:

Anônimo disse...

Olá!
Como exportar dados de um banco de dados slq server 2005 para um segundo banco sql server 2005 remotamente?

Obrigado!
Ivan

Postar um comentário

Jogue sua opinião na lixeira!

Topo