none
Problemas com Download de arquivos .NET RRS feed

  • Pergunta

  • Bom dia, Pessoal.

    Estou com um pequeno problema no Download de arquivos do meu sistema.

    O download é feito corretamente, o arquivo salva bonitinho e tudo mais, porém, todos os arquivos que faço o Download ficam corrompidos.

    XML não abre, TXT fica em branco, Word nem abre e etc.

    Sabem o que pode ser?

    Já tentei de tudo, coloquei TransmitFile e etc, e nada

    Segue meu código de download:

    if (e.CommandName.Equals("download"))
                {
                    //ListaArquivos = clnEntidade.ListaArquivos(dados);
                    string[] chave = e.CommandArgument.ToString().Split(new char[] { '|' });
                    dados.IdVersao = int.Parse(chave[0]);
                    dados.IdArquivo = int.Parse(chave[1]);
                    dados.NomeArquivo = chave[3];
                    dados.TamanhoArquivo = int.Parse(chave[4]);                
                    byte[] byteArquivo = new byte[int.Parse(chave[4])];   
                    Response.Clear();
                    Response.AddHeader("Content-Disposition", "attachment; filename=" + dados.NomeArquivo);
                    Response.AddHeader("Content-Length", dados.TamanhoArquivo.ToString());
                    Response.ContentType = "application/octet-stream";
                    Response.Flush();
                    Response.BinaryWrite(byteArquivo);
                    Response.TransmitFile(dados.NomeArquivo);
                    Response.Flush();
                    Response.Close();
                }

    Agradeço desde já.

    Att.

    segunda-feira, 7 de maio de 2012 13:59

Respostas

  • Consegui galera.

    Tive que fazer uma lista de arquivos e percorrer ela com um For e ai sim fazer o download.

    Agora funcionou perfeito.

    Valeu quem ajudou, segue a solução:

     if (e.CommandName.Equals("download"))
                {
                    string[] chave = e.CommandArgument.ToString().Split(new char[] { '|' });
                    dados.NomeArquivo = chave[3];
                    ListaArquivos = clnEntidade.ListaArquivos(dados);
                    for (int i = 0; i < ListaArquivos.Count; i++)
                    {
                        if (ListaArquivos[i].NomeArquivo == dados.NomeArquivo)
                        {
                            Response.Clear();
                            Response.AddHeader("Content-Disposition", "attachment; filename=" + ListaArquivos[i].NomeArquivo);
                            Response.AddHeader("Content-Length", ListaArquivos[i].TamanhoArquivo.ToString());
                            Response.ContentType = "application/octet-stream";
                            Response.BinaryWrite(ListaArquivos[i].ByteArquivo);
                            Response.End();
                        }
                    }                
                }

    • Marcado como Resposta Progamador.C terça-feira, 8 de maio de 2012 17:53
    terça-feira, 8 de maio de 2012 17:53

Todas as Respostas

  • Já tentei utilizar os 4 tipos abaixo:

    //Response.BinaryWrite(byteArquivo);

    //Response.TransmitFile(dados.NomeArquivo);

    //Response.WriteFile(dados.NomeArquivo);

    //Response.OutputStream.Write(byteArquivo, 0, Convert.ToInt32(dados.TamanhoArquivo));

    segunda-feira, 7 de maio de 2012 14:32
  • Ninguém? =/
    segunda-feira, 7 de maio de 2012 15:47
  • Acredito que o seu problema seja esse Flush(); antes do binary write.

    Tente da seguinte maneira

    if (e.CommandName.Equals("download"))
                {
                    //ListaArquivos = clnEntidade.ListaArquivos(dados);
                    string[] chave = e.CommandArgument.ToString().Split(new char[] { '|' });
                    dados.IdVersao = int.Parse(chave[0]);
                    dados.IdArquivo = int.Parse(chave[1]);
                    dados.NomeArquivo = chave[3];
                    dados.TamanhoArquivo = int.Parse(chave[4]);                
                    Response.Clear();
                    Response.AddHeader("Content-Disposition", "attachment; filename=" + dados.NomeArquivo);
                    Response.AddHeader("Content-Length", dados.TamanhoArquivo.ToString());
                    Response.ContentType = "application/octet-stream";
                    Response.TransmitFile(dados.NomeArquivo); //em NomeArquivo deve conter o caminho para o arquivo localmente exemplo C:\a.txt
                    Response.Flush();
                    Response.Close();
                }

    segunda-feira, 7 de maio de 2012 17:13
  • Tirei o 1º FLush e usei o TransmitFile e não deu certo.

    O problema é que os arquivos que quero fazer download, estão em outro servidor/banco de dados.

    segunda-feira, 7 de maio de 2012 18:05
  • Boa noite Programador.C!

    Fiz no meu programinha desse jeito e funcionou.

                NmArquivo = Sdp.strPath;// O nome do arquivo vem do banco

                string path = Server.MapPath("../uploads/" + NmArquivo);//o caminho onde ira ser salvo o arquivo no download

                System.Windows.Forms.SaveFileDialog SaveFileDialog1 = new System.Windows.Forms.SaveFileDialog();


                Response.ContentType = "application/octet-stream";
                Response.AddHeader("content-disposition", "attachment; filename = " + NmArquivo);
                Response.TransmitFile(path);
                Response.End(); 

    ******************************************************************************************

    Para o upload do arquivo coloco da seguinte maneira:

     if (fuArquivo.PostedFile.ContentLength > 0)
                                {
                                    FileInfo fileInfo = new FileInfo(fuArquivo.PostedFile.FileName);
                                    fileName = strIdNmJob + "_" + idPeca + fileInfo.Extension;//Nome do arquivo
                                    pathFile = Server.MapPath("../uploads/" + fileName); // local fisico onde ira ficar a imagem
                                    fuArquivo.PostedFile.SaveAs(pathFile); //caminho
                                    SDP.strPath = fileName;//salvo caminho no banco

    }

    Espero ter ajudado.

    =)

    ____________________________________________________________________________________________________

    "Não somos sozinhos no mundo, cooperemos uns com os outros".


    segunda-feira, 7 de maio de 2012 21:14
  • Não está dando certo.

    Acredito que seja no Download mesmo, porque meu sistema faz em outros lugares esse download e só nessa parte que estou tendo problemas.

    Não sei o que pode ser =/

    terça-feira, 8 de maio de 2012 10:48
  • Programador C - Posta todo seu codigo talvez seja mis facil de acharmos a reposta.
    terça-feira, 8 de maio de 2012 15:13
  • Consegui galera.

    Tive que fazer uma lista de arquivos e percorrer ela com um For e ai sim fazer o download.

    Agora funcionou perfeito.

    Valeu quem ajudou, segue a solução:

     if (e.CommandName.Equals("download"))
                {
                    string[] chave = e.CommandArgument.ToString().Split(new char[] { '|' });
                    dados.NomeArquivo = chave[3];
                    ListaArquivos = clnEntidade.ListaArquivos(dados);
                    for (int i = 0; i < ListaArquivos.Count; i++)
                    {
                        if (ListaArquivos[i].NomeArquivo == dados.NomeArquivo)
                        {
                            Response.Clear();
                            Response.AddHeader("Content-Disposition", "attachment; filename=" + ListaArquivos[i].NomeArquivo);
                            Response.AddHeader("Content-Length", ListaArquivos[i].TamanhoArquivo.ToString());
                            Response.ContentType = "application/octet-stream";
                            Response.BinaryWrite(ListaArquivos[i].ByteArquivo);
                            Response.End();
                        }
                    }                
                }

    • Marcado como Resposta Progamador.C terça-feira, 8 de maio de 2012 17:53
    terça-feira, 8 de maio de 2012 17:53