Usuário com melhor resposta
Problemas com Download de arquivos .NET

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.
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
Todas as Respostas
-
-
-
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(); }
-
-
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".
-
-
-
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