Stream 是一个父类, 子类如果是MemoryStream 经常会因为被其它代码处理过. 会将指针指向到流的最后. 而这个时候.取出数据是取不到的. 所以要先定位到 0
ms.Position = 0; //流在输出之前一定要先定位到0.否则.读出的数据全都是0
/// <summary>
/// 把流输出到客户端
/// </summary>
/// <param name="ms"></param>
/// <param name="Response"></param>
public static void StreamToWebClient(Stream ms, HttpResponse Response, string ContentType)
{
Response.Clear();
Response.ContentType = ContentType;
Response.ContentEncoding = System.Text.Encoding.UTF8;
Response.Charset = "utf-8";
Response.AddHeader("Content-Length", ms.Length.ToString());
//Response.AddHeader("Content-Disposition", "attachment;FileName=out.pdf"); //如果需要下载而不是在IE中看的话
//如果附件名为中文:Response.AddHeader("Content-Disposition", "attachment;FileName=" + HttpUtility.UrlEncode("中文.pdf"));
try
{
if (ms != null)
{
long fileSize = ms.Length;
byte[] fileBuffer = new byte[fileSize];
ms.Position = 0; //流在输出之前一定要先定位到0.否则.读出的数据全都是0
ms.Read(fileBuffer, 0, (int)fileSize);
//如果不写fileStream.Close()语句,用户在下载过程中选择取消,将不能再次下载
ms.Close();
Response.BinaryWrite(fileBuffer);
//Response.WriteFile("d:\\out.pdf");
Response.OutputStream.Flush();
Response.OutputStream.Close();
}
else
{
Response.ContentType = "text/html";
Response.Write("数据流为null,请联系管理员!");
}
}
catch (Exception ex)
{
Response.ContentType = "text/html";
Response.Write(ex.Message);
}
//Response.End();
//Response.Close();
}