2011-04-29 77 views

回答

17

由于您使用MVC,最好的办法是使用FileStreamResult

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

与控制器Response.WriteResponse.OutputStream打非惯用的和没有理由的时候已经存在一个写自己的ActionResult 。

-2

请试试这个:

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

确定为Web表单的方式s但不适用于mvc – lnu 2011-04-29 09:57:29

+0

为什么字节数组的长度是1024?如果它的大小超过了你的定义呢? – 2014-08-26 08:12:30

+0

因为文件未关闭而Downvote。 – arni 2017-12-01 17:14:37

11

一种方式做到这一点如下:

//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(); 
} 

您还可以使用GZIP压缩,以加快文件传输到客户端(少流式传输)。

+1

最好在IIS7配置中设置动态内容的压缩,以便在整个板上进行。 – Talljoe 2011-04-29 05:54:21

+0

@Talljoe - 同意我也这样设置它,我应该更清楚 – ljkyser 2011-04-29 05:56:24

3

HTTP响应是通过HttpContext.Response.OutputStream属性暴露给你一个流,所以如果你有PDF文件流,你可以简单地将数据从一个流复制到其他:

CopyStream(pdfStream, response.OutputStream); 

对于实施CopyStream看到Best way to copy between two Stream instances - C#

5

在asp.net这是下载一个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

我想这个答案更多,如果它是用c#编写的,就像问题 – JSON 2016-08-10 20:26:17

+0

Downvote,因为FileStream不会自动处理(尝试/最后或使用)。 – arni 2017-12-01 17:16:40