2012-02-14 24 views
5

En ASP.Net (con C#), intento crear un archivo .DAT con texto sin formato y enviarlo al navegador para forzar la descarga. He intentado varias cosas pero no puedo hacer que funcione. En mi aspx-archivo hay un ImageButtonForce download ASP.Net

<asp:ImageButton ID="btnSave" runat="server" CausesValidation="False" ImageUrl="~/Images/Stages/Database/Save.png" OnClick="btnSave_OnClick" Width="26px" /> 

En el OnClick método que estoy tratando de crear el archivo y enviarlo al navegador. existe

protected void btnSave_OnClick(object sender, EventArgs e) 
{ 
    string file = "test.dat"; 
    string fileName = "~\\Stages\\Broekx\\Databanken\\" + file; 

    FileStream fs = new FileStream(MapPath(fileName), FileMode.Open); 
    long cntBytes = new FileInfo(MapPath(fileName)).Length; 
    byte[] byteArray = new byte[Convert.ToInt32(cntBytes)]; 
    fs.Read(byteArray, 0, Convert.ToInt32(cntBytes)); 
    fs.Close(); 

    ImageButton btnSave = (ImageButton)FormViewStagesDummy.FindControl("btnSave"); 
    btnSave.Visible = false; 

    File.Delete(Server.MapPath(fileName)); 

    if (byteArray != null) 
    { 
     this.Response.Clear(); 
     this.Response.ContentType = "text/plain"; 
     this.Response.AddHeader("content-disposition", "attachment;filename=" + file); 
     this.Response.BinaryWrite(byteArray); 
     this.Response.End(); 
     this.Response.Flush(); 
     this.Response.Close(); 
    } 
} 

El archivo test.dat en la carpeta correcta y tiene que ser eliminado después de que ha sido leído en bytes. Lo intenté sin borrar el archivo y tampoco funcionará.

Después de hacer clic en btnGuardar el botón debe ocultarse, por eso configuro el parámetro Visible como falso.

También lo probé con el tipo de contenido "application/octet-stream" o con un archivo PDF y tipo de contenido "application/pdf" pero nada funciona. La página se carga normalmente y no se está descargando ningún archivo.

+0

Sospecho que parte de la respuesta se envía antes de los encabezados. Tampoco entiendo cómo espera una única respuesta para descargar un archivo y hacer que un botón sea invisible al mismo tiempo. – CodesInChaos

+0

Pensé algo similar, pero ¿cómo puedo hacer que esto funcione? – Yoni

+1

Como nota al margen: observe 'File.ReadAllBytes' que puede reemplazar las 5 líneas que usa para leer el archivo. Sin embargo, solo debes hacer eso con archivos muy pequeños, quizás hasta 10kB. – CodesInChaos

Respuesta

3

¿La ruta de la cadena de archivos es realmente correcta?

this.Response.AddHeader("content-disposition", "attachment;filename=" + file); 

¿No debería ser el nombre de archivo?

¿Por qué está eliminando el archivo antes de escribirlo en la respuesta? ¿No tendría más sentido servir el archivo a través de la respuesta y luego eliminarlo?

es decir llamar

File.Delete(Server.MapPath(fileName)); 

después de la repsonse.

Usted debe tratar:

Response.TransmitFile(Server.MapPath(fileName)); 
Response.End(); 

TransmitFile es muy eficiente, ya que, básicamente, descarga el archivo de secuencias de IIS, incluso causando potencialmente el archivo para ser almacenado en caché en la memoria caché Kernel (basado en reglas de caché de IIS). Response.End();

+0

Lo he intentado sin eliminar el archivo, pero tampoco funciona. En el método AddHeader, solo se debe completar el nombre sugerido del archivo. Entonces no es la ruta completa, sino solo una sugerencia para el nombre del archivo. – Yoni

+0

¿Has probado Response.TransmitFile()? En lugar de BinaryWrite()? – Seany84

+0

Acabo de probarlo pero el mismo resultado – Yoni

0
   Response.Clear(); 
       Response.ClearContent(); 
       Response.ClearHeaders(); 
       Response.ContentType = "text/plain"; 
       Response.AppendHeader("Content-Disposition", "attachment; filename = " + fileName); 
       Response.TransmitFile(Server.MapPath("~/foldername/" + fileName)); 
       Response.End();