2009-12-14 22 views

Respuesta

7

Here's a Microsoft Knowledge Base article on this.

cómo recuperar el archivo desde su base de datos depende de la tecnología de acceso a datos que use; Asumiré que tiene alguna matriz de bytes data que contiene el archivo (por ejemplo, rellenando un DataSet y accediendo al campo) y alguna cadena filename.

Response.Clear() 
Response.ContentType = "application/octet-stream" 
Response.AddHeader("Content-Disposition", "attachment;filename=""" & filename & """") 
Response.BinaryWrite(data) 
Response.End() 

poner el código anterior en algunos download.aspx y el enlace a este archivo. Probablemente desee pasar alguna información de cadena de consulta a su download.aspx, para que su código sepa qué archivo debe obtener de la base de datos.

3

Lea los datos en un objeto filestream con la extensión apropiada añadida a él, y pida al usuario que descargue el archivo resultante.

Usted querrá utilizar el objeto System.IO BinaryWriter en el filestream para crear el archivo ... algo como esto:

FileStream fs = new FileStream("thisfile.bin", FileMode.Create); 
binWriter= new BinaryWriter(fs);  

binWriter.Write(varHoldingSqlRetrievedBinaryData); 
+0

Entonces, ¿cómo puedo obtener la extensión de los datos binarios? – Tarik

+0

Y podría proporcionar un código de muestra, porque sabía lo que dijo, pero en el código puedo necesitar un ejemplo :( – Tarik

+0

no hay forma de hacerlo. La mejor manera sería almacenar la extensión en la base de datos. –

2

Agregue una página Generic Handler (.ashx) a su sitio web. El cuerpo de código ashx siguiente muestra cómo leer una corriente arbitraria (en este caso un archivo PNG de disco) y escribirlo en la respuesta:

using System; 
using System.Web; 
using System.IO; 

namespace ASHXTest 
{ 
    public class GetLetter : IHttpHandler 
    { 
     public void ProcessRequest(HttpContext context) 
     { 
      // Get letter parameter from query string. 
      string fileName = context.Request.MapPath(string.Format("{0}.png", 
       context.Request.QueryString["letter"])); 

      // Load file from disk/database/ether. 
      FileStream stream = new FileStream(fileName, FileMode.Open, 
       FileAccess.Read); 
      byte[] buffer = new byte[stream.Length]; 
      stream.Read(buffer, 0, buffer.Length); 
      stream.Close(); 

      // Write response headers and content. 
      context.Response.ContentType = "image/png"; 
      context.Response.OutputStream.Write(buffer, 0, buffer.Length); 
     } 

     public bool IsReusable 
     { 
      get 
      { 
       return false; 
      } 
     } 
    } 
} 

Si lo desea, también puede definir la cabecera Content-Disposition como se demuestra en La respuesta de Heinzi:

context.Response.AddHeader("Content-Disposition", 
    "attachment;filename=\"letter.png\""); 
Cuestiones relacionadas