none
Download de arquivo pelo GridView

    Question

  • Galera!  Sou iniciante me ASP.  E, estou com uma dúvida em um código em C#. Preciso listar os diretórios e arquivos em uma pagina para que fique disponivel para o usuário efetuar o doenload.

    Já pesquisei em alguns foruns e não localizei nada que me ajudasse.  Consegui um código que lista o conteúdo do diretório e os arquivos em um gridview, mas não consigo fazer o download do arquivo. 

    O código que tenho é o seguinte:

    public partial class Reports_report_diario : System.Web.UI.Page
    {
      protected void Page_Load(object sender, EventArgs e)
      {
        loadFolder(RelDiario, Server.MapPath("~/conteudos/relatorios/diario/"));
      }
    
     
    
      public void loadFolder(GridView gv_arquivos, String folder)
      {
        DirectoryInfo pasta = new DirectoryInfo(folder);
        DirectoryInfo[] subPastas = pasta.GetDirectories();
        FileInfo[] arquivos = pasta.GetFiles();
    
    
        DataTable dt = new DataTable();
    
        dt.Columns.Add("Nome");
        dt.Columns.Add("Tamanho");
        dt.Columns.Add("Tipo");
        dt.Columns.Add("Modificado");
        dt.Columns.Add("Baixar");
    
        if (folder != "")
        {
          DataRow dr1 = dt.NewRow();
          dr1["Nome"] = "../";
          dr1["Tamanho"] = "";
          dr1["Tipo"] = "";
          dr1["Modificado"] = "";
          dr1["Baixar"] = "";
    
          dt.Rows.Add(dr1);
        }
        foreach (DirectoryInfo dir in subPastas)
        {
          DataRow dr = dt.NewRow();
          dr["Nome"] = ">>" + dir.Name;
          dr["Tamanho"] = "-";
          dr["Tipo"] = "Diretório";
          dr["Modificado"] = dir.LastWriteTime.ToString("dd/MM/yyyy");
          dr["Baixar"] = "";
    
          dt.Rows.Add(dr);
        }
    
        foreach (FileInfo file in arquivos)
        {
          DataRow dr = dt.NewRow();
          dr["Nome"] = file.Name;
          dr["Tamanho"] = Convert.ToString(file.Length / 1024) + " kb";
          dr["Tipo"] = file.Extension;
          dr["Modificado"] = file.LastWriteTime.ToString("dd/MM/yyyy");
          dr["Baixar"] = "";
    
          dt.Rows.Add(dr);
        }
    
        gv_arquivos.DataSource = dt;
        gv_arquivos.DataBind();
    
      }
    
    }

     

    Se alguém tiver outro metódos de executar esta tarefa...

     

     

    Sunday, July 24, 2011 9:57 PM

Answers

  • Cara,

     

    Consegi resolver usando o treeview para listar as pastas e subpastas, já que elas não mudam.

     

    Valeu pela ajuda.

     

    Abçs

    • Marked as answer by Frank Thadeu Tuesday, July 26, 2011 11:43 PM
    Tuesday, July 26, 2011 11:42 PM

All replies

  • Olá Frank, peguei o seu método acima e só adicionei a rotina de download do arquivo, segue abaixo, e é bom você colocar os mimetype dos arquivos que você vai disponibilizar para download:
    http://en.wikipedia.org/wiki/Internet_media_type

    .aspx
    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication5.WebForm1" %>
    
    <!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:GridView ID="RelDiario" runat="server" AutoGenerateColumns="false">
          <Columns>
            <asp:BoundField DataField="Nome" HeaderText="Nome" />
            <asp:BoundField DataField="Tamanho" HeaderText="Tamanho" />
            <asp:BoundField DataField="Tipo" HeaderText="Tipo" />
            <asp:BoundField DataField="Modificado" HeaderText="Modificado" />
            <asp:TemplateField HeaderText="Baixar">
              <ItemTemplate>
                <asp:LinkButton ID="lkBaixar" OnClick="lkBaixar_Click" runat="server" CommandArgument='<%# Eval("Nome") %>'>Efetuar download</asp:LinkButton>
              </ItemTemplate>
            </asp:TemplateField>
          </Columns>
        </asp:GridView>
      </div>
      </form>
    </body>
    </html>
    
    

    .cs
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Data;
    using System.IO;
    
    namespace WebApplication5
    {
      public partial class WebForm1 : System.Web.UI.Page
      {
    
        protected void Page_Load(object sender, EventArgs e)
        {
          if (!IsPostBack)
          {
            loadFolder(RelDiario, Server.MapPath("~/arquivos/"));
          }
        }
    
        protected void lkBaixar_Click(object sender, EventArgs e)
        {
          LinkButton lk = (LinkButton)sender;
          string nomeArquivo = lk.CommandArgument;
    
          //Pegando caminho fisico aonde se encontra arquivos e falando qual o arquivo a ser baixado
          //pelo nome
          string caminhoArquivo = Server.MapPath("~/arquivos/" + nomeArquivo);
    
          //criando uma instancia do FileInfo para recuperar informações sobre o arquivo
          FileInfo file = new FileInfo(caminhoArquivo);
    
          //Verificando se o arquivo realmente existe
          if (file.Exists)
          {
            //Limpando o clear content
            Response.ClearContent();
    
            //Adicionando o nome do arquivo e forçando a caixa de dialago abrir/salvar/cancelar
            Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name);
    
            //Adicionando o tamnho do arquivo no response headerr
            Response.AddHeader("Content-Length", file.Length.ToString());
    
            //Espeficino o contet type do arquivo
            Response.ContentType = ReturnExtension(file.Extension.ToLower());
    
            //tramistindo arquivo
            Response.TransmitFile(file.FullName);
    
            //Fim do Response
            Response.End();
          }
        }
    
        /// <summary>
        /// Método que retorna o mime type do arquivo, existe muitos mimetype
        /// consultar internet caso esteja faltando algum
        /// </summary>
        /// <param name="fileExtension"></param>
        /// <returns></returns>
        private string ReturnExtension(string fileExtension)
        {
          switch (fileExtension)
          {
            case ".htm":
            case ".html":
            case ".log":
              return "text/HTML";
            case ".txt":
              return "text/plain";
            case ".doc":
              return "application/ms-word";
            case ".tiff":
            case ".tif":
              return "image/tiff";
            case ".asf":
              return "video/x-ms-asf";
            case ".avi":
              return "video/avi";
            case ".zip":
              return "application/zip";
            case ".xls":
            case ".csv":
              return "application/vnd.ms-excel";
            case ".gif":
              return "image/gif";
            case ".jpg":
            case "jpeg":
              return "image/jpeg";
            case ".bmp":
              return "image/bmp";
            case ".wav":
              return "audio/wav";
            case ".mp3":
              return "audio/mpeg3";
            case ".mpg":
            case "mpeg":
              return "video/mpeg";
            case ".rtf":
              return "application/rtf";
            case ".asp":
              return "text/asp";
            case ".pdf":
              return "application/pdf";
            case ".fdf":
              return "application/vnd.fdf";
            case ".ppt":
              return "application/mspowerpoint";
            case ".dwg":
              return "image/vnd.dwg";
            case ".msg":
              return "application/msoutlook";
            case ".xml":
            case ".sdxl":
              return "application/xml";
            case ".xdp":
              return "application/vnd.adobe.xdp+xml";
            default:
              return "application/octet-stream";
          }
        }
    
        public void loadFolder(GridView gv_arquivos, String folder)
        {
          DirectoryInfo pasta = new DirectoryInfo(folder);
          DirectoryInfo[] subPastas = pasta.GetDirectories();
          FileInfo[] arquivos = pasta.GetFiles();
    
          DataTable dt = new DataTable();
    
          dt.Columns.Add("Nome");
          dt.Columns.Add("Tamanho");
          dt.Columns.Add("Tipo");
          dt.Columns.Add("Modificado");
          dt.Columns.Add("Baixar");
    
          if (folder != "")
          {
            DataRow dr1 = dt.NewRow();
            dr1["Nome"] = "../";
            dr1["Tamanho"] = "";
            dr1["Tipo"] = "";
            dr1["Modificado"] = "";
            dr1["Baixar"] = "";
    
            dt.Rows.Add(dr1);
          }
          foreach (DirectoryInfo dir in subPastas)
          {
            DataRow dr = dt.NewRow();
            dr["Nome"] = ">>" + dir.Name;
            dr["Tamanho"] = "-";
            dr["Tipo"] = "Diretório";
            dr["Modificado"] = dir.LastWriteTime.ToString("dd/MM/yyyy");
            dr["Baixar"] = "";
    
            dt.Rows.Add(dr);
          }
    
          foreach (FileInfo file in arquivos)
          {
            DataRow dr = dt.NewRow();
            dr["Nome"] = file.Name;
            dr["Tamanho"] = Convert.ToString(file.Length / 1024) + " kb";
            dr["Tipo"] = file.Extension;
            dr["Modificado"] = file.LastWriteTime.ToString("dd/MM/yyyy");
            dr["Baixar"] = new LinkButton() { Text = "Baixar" };
    
            dt.Rows.Add(dr);
          }
    
          gv_arquivos.DataSource = dt;
          gv_arquivos.DataBind();
        }
      }
    }
    

    Referencias:
    http://msdn.microsoft.com/en-us/library/dhy78ycf.aspx
    http://dotnetslackers.com/community/blogs/haissam/archive/2007/04/03/Downloading-Files-C_2300_.aspx
    http://www.west-wind.com/weblog/posts/2007/May/21/Downloading-a-File-with-a-Save-As-Dialog-in-ASPNET


     
    Vitor Mendes | Seu feedback é muito importante para todos!
    Monday, July 25, 2011 1:24 AM
  • Olá Vitor,

    Funcionou perfeitamente.  Só fiquei com uma dúvida. No caso de haver pasta de arquivo, como fazer para listar o conteúdo da pasta ao invés de força o download?

     

    Monday, July 25, 2011 3:08 AM
  • Bom dia Frank,

    Não entendi muito bem Frank, no caso seria para baixar todos os arquivos da pasta em um download só ?? ou seria algo de pode ir navegando entre as pasta.


    Vitor Mendes | Seu feedback é muito importante para todos!
    Monday, July 25, 2011 12:05 PM
  • Bom dia Vitor!

    Em algumas pastas tem subpastas. Preciso navegar nas subpastas e abrir o arquivo contido nelas (um de cada vez).  O código já lista as subpastas, mas ésta executando rotina de download.

    Monday, July 25, 2011 1:16 PM
  • Cara,

     

    Consegi resolver usando o treeview para listar as pastas e subpastas, já que elas não mudam.

     

    Valeu pela ajuda.

     

    Abçs

    • Marked as answer by Frank Thadeu Tuesday, July 26, 2011 11:43 PM
    Tuesday, July 26, 2011 11:42 PM
  • Vitor,boa noite!

    Testei o código para listar os arquivos no gridview ,mas quando eu faço download do arquivo, ele retira a extenção do mesmo, deixando o ícone do documento em branco e quando clico em cima dele para executá-lo, ele pede para eu selecionar um aplicativo para ler o documento.

    mudei no código o nome do executável do meu word, mas não deu certo.

    return "application/WINWORD";

    O QUE PODE SER ? COMO RESOLVE ISSO?

    Abraços!

    Aislan Miranda

    Wednesday, July 27, 2011 10:32 PM
  • Olá Aislan, certamente o mime type do word esta incorreto, segue uma lista de mime type de aplicativos office:

    .doc

    application/msword

    .dot

    application/msword

    .docx

    application/vnd.openxmlformats-officedocument.wordprocessingml.document

    .dotx

    application/vnd.openxmlformats-officedocument.wordprocessingml.template

    .docm

    application/vnd.ms-word.document.macroEnabled.12

    .dotm

    application/vnd.ms-word.template.macroEnabled.12

    .xls

    application/vnd.ms-excel

    .xlt

    application/vnd.ms-excel

    .xla

    application/vnd.ms-excel

    .xlsx

    application/vnd.openxmlformats-officedocument.spreadsheetml.sheet

    .xltx

    application/vnd.openxmlformats-officedocument.spreadsheetml.template

    .xlsm

    application/vnd.ms-excel.sheet.macroEnabled.12

    .xltm

    application/vnd.ms-excel.template.macroEnabled.12

    .xlam

    application/vnd.ms-excel.addin.macroEnabled.12

    .xlsb

    application/vnd.ms-excel.sheet.binary.macroEnabled.12

    .ppt

    application/vnd.ms-powerpoint

    .pot

    application/vnd.ms-powerpoint

    .pps

    application/vnd.ms-powerpoint

    .ppa

    application/vnd.ms-powerpoint

    .pptx

    application/vnd.openxmlformats-officedocument.presentationml.presentation

    .potx

    application/vnd.openxmlformats-officedocument.presentationml.template

    .ppsx

    application/vnd.openxmlformats-officedocument.presentationml.slideshow

    .ppam

    application/vnd.ms-powerpoint.addin.macroEnabled.12

    .pptm

    application/vnd.ms-powerpoint.presentation.macroEnabled.12

    .potm

    application/vnd.ms-powerpoint.template.macroEnabled.12

    .ppsm

    application/vnd.ms-powerpoint.slideshow.macroEnabled.12 



    Marque como resposta cada tenha sido util.

    Referencia:
    http://blogs.msdn.com/b/vsofficedeveloper/archive/2008/05/08/office-2007-open-xml-mime-types.aspx 


    Vitor Mendes | Seu feedback é muito importante para todos!


    Wednesday, July 27, 2011 11:44 PM
  • Vitor,Boa Tarde!

    Seguindo sua dica, o problema persistiu, eu faço o download do documento no GridView, ele aparece a tela para download informando o aplicativo que abrirá o documento e baixo o arquivo. Quando vou no local para onde o arquivo foi baixado, o ícone não aparece o aplicativo que vai abrir este documento, como por exemplo, no caso do .doc o Microsoft Word ele coloca no ícone uma folhinha em branco e quando clico em cima, ele pede para eu informar um aplicativo para abrir este documento.

    Alguém alguma sugestão para eu solucionar este caso? Estou precisando para implementar isso no meu projeto.

    Abraços!

    Aislan Miranda

    Friday, July 29, 2011 3:55 PM
  • Aislan,

    utilizei este metodo em minha solução e esta funcionando perfeitamente.

    tente isto:

        /// consultar internet caso esteja faltando algum
      private string ReturnExtension(string fileExtension)
        {
          switch (fileExtension)
          {
            case ".docx":
            case ".doc":
              return "application/ms-word";
           }

        }

     

    outra:

    Se vc estiver utilizando o IIS, verifique se as extensões estão no tipo mine, como sugerido pelo Vitor.

     

    Saturday, July 30, 2011 12:56 AM
  • Galera,Boa Noite!

    Depois de muita surra para tentar resolver este problema de downloads de arquivos no gridview, pensei em testar o óbvido, pensei por um momento "Porra, será que é o navegador?" rsrsrsrs, e não era o danado!

    Valeu galera, topico encerrado.

     

    Aislan Miranda
    • Proposed as answer by Aislan Miranda Thursday, August 04, 2011 12:59 AM
    Thursday, August 04, 2011 12:59 AM
  • Funciona perfeitamente, só tem um porém.

    Como faço pra excluir o item da gridview e do banco, através de um linkButton?

    Como esse do download. Mas pra excluir.

    Obrigado! Abraço!

    Wednesday, March 06, 2013 8:39 AM
  • Funciona perfeitamente, só tem um porém.

    Como faço pra excluir o item da gridview e do banco, através de um linkButton?

    Como esse do download. Mas pra excluir.

    Obrigado! Abraço!

    Consegui.

    Lá vai o código, pode ajudar alguém que precise:

                                                    

     protected void lnkExcluir_Click(object sender, EventArgs e)
            {
    // ~ INÍCIO : PEGAR O FILEPATH DO ARQUIVO
                LinkButton linkButton = sender as LinkButton;
                GridViewRow gvrow = linkButton.NamingContainer as GridViewRow;
                string nomeArq = gvDetails.DataKeys[gvrow.RowIndex].Value.ToString();
    // ~ FIM : FILEPATH DO ARQUIVO



                con.Open();
                SqlCommand cmd = new SqlCommand("DELETE FROM FilesTable WHERE FilePath = '"+ nomeArq + "'", con);
                cmd.ExecuteNonQuery();
                con.Close();
                BindGridviewData();
            }

    Observação: Além de deletar da GridView, está deletando do banco. Se você quiser deletar só da GridView é só ajustar o código. Abraço!

    Thursday, March 07, 2013 11:25 AM
  • Observação2: A instancia "con" vem da string de conexao, no caso o meu era: 

    private SqlConnection con = new SqlConnection("Data Source=VINICIUS-WIN\\SQLServer;Initial Catalog=TesteUpload2;User ID=xxxxx;Password=xxxxx");

    Thursday, March 07, 2013 11:29 AM
  • Cara obrigado, vc me ajudou muito. Valeu vc é fera mesmo.

    Analista, Programador e Web Designer

    Wednesday, September 11, 2013 9:57 PM