我需要在新选项卡中打开pdf,它可以正常工作并且文件显示完美,但是如果我使用notepadd ++打开File,则在EOF之后有一些NULL字符(请参见图片)。 碰巧只有我在新选项卡中打开它并使用memorystream,EOF之后的字符串在客户端的解析器中产生了一些问题,怎么了?
这是代码:
Dim mswithPage As New MemoryStream()
Dim SessValue As String = Request.QueryString("s")
Dim NOrder As String = Request.QueryString("odv")
mswithPage = CType(Session(SessValue), MemoryStream)
Response.Clear()
Response.ContentType = "Application/pdf"
Response.AddHeader("content-disposition", "inline;filename=" & NOrder & ".pdf")
Response.OutputStream.Write(mswithPage.GetBuffer(), 0, mswithPage.GetBuffer().Length)
Response.OutputStream.Flush()
Response.OutputStream.Close()
Response.End()
答案 0 :(得分:0)
此行中有一个问题:
Response.OutputStream.Write(mswithPage.GetBuffer(), 0, mswithPage.GetBuffer().Length)
甚至更精确地说是其最终参数mswithPage.GetBuffer().Length
-您应该使用缓冲区中实际使用的 字节数,但要使用 complete 缓冲区的大小
因此,请改用mswithPage.Length
:
Response.OutputStream.Write(mswithPage.GetBuffer(), 0, mswithPage.Length)
MemoryStream
已经关闭如果MemoryStream
已经关闭,则上面的解决方案将不再起作用,因为其Length
属性只能在开放的流上使用。
ToArray
方法对封闭流有效!因此,您可以改用
Response.OutputStream.Write(mswithPage.ToArray())
(实际上,ToArray
在关闭的流上有效,但Length
却不能。有趣的是,ToArray
本质上返回前Length
个字节的副本内部缓冲区...)