2011-04-29 11 views

Respuesta

17

dado que está utilizando MVC, la mejor manera es utilizar FileStreamResult:

return new FileStreamResult(stream, "application/pdf") 
{ 
    FileDownloadName = "file.pdf" 
}; 

Jugando con Response.Write o Response.OutputStream desde su controlador es no-idiomática y no hay razón para escribir su propia ActionResult cuando ya existe .

-2

Por favor, intente éste:

protected void Page_Load(object sender, EventArgs e) { 
     Context.Response.Buffer = false; 
     FileStream inStr = null; 
     byte[] buffer = new byte[1024]; 
     long byteCount; inStr = File.OpenRead(@"C:\Users\Downloads\sample.pdf"); 
     while ((byteCount = inStr.Read(buffer, 0, buffer.Length)) > 0) { 
      if (Context.Response.IsClientConnected) { 
       Context.Response.ContentType = "application/pdf"; 
       Context.Response.OutputStream.Write(buffer, 0, buffer.Length); 
       Context.Response.Flush(); 
      } 
     } 
    } 
+0

bien para formulario web s pero no para mvc – lnu

+0

¿Por qué la longitud de la matriz de bytes es 1024? ¿Qué pasa si su tamaño es más de lo que definió? –

+0

Voto descendente porque el archivo no está cerrado. – arni

11

Una forma de hacerlo es la siguiente:

//assuming you have your FileStream handle already - named fs 
byte[] buffer = new byte[4096]; 
long count = 0; 

while ((count = fs.Read(buffer, 0, buffer.Length)) > 0) 
{ 
    response.OutputStream.Write(buffer, 0, count); 
    response.Flush(); 
} 

También puede utilizar la compresión GZIP para acelerar la transferencia del archivo al cliente (menos bytes transmitidos).

+1

Es mejor simplemente configurar la compresión de contenido dinámico en la configuración de IIS7 para que ocurra en todos los ámbitos. – Talljoe

+0

@Talljoe: acordé que también lo habría configurado de esa manera, debería haber sido más claro – ljkyser

3

la respuesta HTTP es una corriente expuesta a usted a través de la propiedad HttpContext.Response.OutputStream, así que si tienes el archivo PDF en una corriente que puede simplemente copiar los datos desde una secuencia a la otra:

CopyStream(pdfStream, response.OutputStream); 

Para una implementación de CopyStream ver Best way to copy between two Stream instances - C#

5

En asp.net esta es la manera de descargar un archivo pdf

Dim MyFileStream As FileStream 
    Dim FileSize As Long 

    MyFileStream = New FileStream(filePath, FileMode.Open) 
    FileSize = MyFileStream.Length 

    Dim Buffer(CInt(FileSize)) As Byte 
    MyFileStream.Read(Buffer, 0, CInt(FileSize)) 
    MyFileStream.Close() 

    Response.ContentType = "application/pdf" 
    Response.OutputStream.Write(Buffer, 0, FileSize) 
    Response.Flush() 
    Response.Close() 
+1

Me gustaría mucho más esta respuesta si estuviera escrita en C# como la pregunta – JSON

+0

Voto porque FileStream no se elimina automáticamente (try/finally o usando). – arni