segunda-feira, 15 de abril de 2013

Upload e Download de arquivo com LINQ


Fazer um upload de um arquivo qualquer para o banco de dados através do LINQ é muito fácil.


Criei em meu banco de dados uma tabela chamada documento, com os seguintes campos:
Tipo de dados:
Id – Uniqueidentifier
Nome – Varchar(max)
Arquivo – Image

Adicionei ao projeto um arquivo do tipo LINQ to SQL  com o nome de Banco.dbml  e adicionei a tabela documento.

Feito isso, precisamos criar a página que irá enviar o arquivo. No meu caso é a Default.aspx. veja como ficou o código:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="default.aspx.cs" Inherits="ExemploWeb._default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:FileUpload ID="UpArquivo" runat="server" />

        <br />

        <asp:Button ID="BtnEnviar" Text="Enviar" runat="server"
            onclick="BtnEnviar_Click"  />
    </div>
    </form>
</body>
</html>


O controle “asp:FileUpload” é necessário para fazer o upload e o controle do tipo Button que irá realizar toda mágica.  Repare que eu adicionei um evento chamado onClick e apontei para a função “BtnEnviar_Click”.  Essa função deverá ser criada no arquivo Default.aspx.cs. Veja abaixo:

       protected void BtnEnviar_Click(object sender, EventArgs e)
        {
            if (UpArquivo.HasFile && UpArquivo.PostedFile.ContentLength > 0)
            {

                byte[] _arquivo = UpArquivo.FileBytes;

                BancoDataContext bd = new BancoDataContext();
                documento doc = new documento();
                doc.id = Guid.NewGuid();
                doc.nome = UpArquivo.FileName;
                doc.arquivo = _arquivo;
                bd.documentos.InsertOnSubmit(doc);
                bd.SubmitChanges();

            }
        }

No exemplo acima eu armazenei o  arquivo, em formato de bytes, na variável _arquivo. Após armazenar o arquivo  foi criado um Contexto do meu banco de dados, dei o nome de bd. Esse contexto vem do LINQ e é responsável pela ligação do C# com o SQL.

Criei uma nova instancia do objeto documento e atribuir os valores, id, nome e arquivo.
O método InsertOnSubmit é responsável por guardar o objeto em cache até executar o submit, que é o método SubmitChanges, Até esse momento o registro ainda não existe no banco de dados.

Veja como ficou:
Clicando no botão “Escolher arquivo” a seguinte janela será exibida:

Vou escolher esse arquivo PDF e clicar em open.


Feito isso é só clicar em enviar.  O resultado já pode ser visto no banco de dados. 


Para realizar o Download do arquivo basta colocar esse trecho de código no evento do botão download, que pode ser criado exatamente como o botão enviar.
protected void BtnDownload_Click(object sender, EventArgs e)
        {
            BancoDataContext bd = new BancoDataContext();
            var arquivos = from c in bd.documentos select c;
            foreach (documento arquivo in arquivos)
            {
                Response.AddHeader("Content-Disposition", "attachment; filename=" + arquivo.nome);
                Response.ContentType = "application/x-zip-compressed";

                if (arquivo.arquivo != null)
                    Response.BinaryWrite(arquivo.arquivo.ToArray());
            }

        }







Um comentário: