我花了几天时间试图找到这个问题的解决方案,我也尽我所能在网上搜索,但我不知道还能做什么,这就是发生的事情:
我已经签署了一个 PDF(我不知道这是否相关,但我还是提到了它)并且我已经将它的字节数组保存到一个 SQL 服务器数据表中,在一个 varbinary 字段中。
当我检索数据并使用 net 方法File.WriteAllBytes
在服务器中创建 PDF 时,它可以工作并且我得到签名的 PDF。
但是,如果我使用任何Response
对象的方法来下载该文件或保存在数据库中的字节数组(TransmitFile
, OutputStream.Write
, BinaryWrite
),我会得到一个空白 PDF 文件,其字节内容与原始文件内容不匹配。
我已经尝试了所有这些方法并没有成功地更改了许多属性(contentType
, AddHeader
, ...)。
我试过的代码(你可以看到有很多不同的方法):
arrByte = CType(ds.Tables(0).Rows(0).Item("DATA"), Byte())
'HttpContext.Current.Response.ContentType = "application/pdf"
HttpContext.Current.Response.ContentType = "application/octet-stream"
HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=""test.pdf""")
Dim oStream As New System.IO.MemoryStream(arrByte)
LoadStreamToStream(oStream, Response.OutputStream)
'File.WriteAllBytes(pdfPath, arrByte)
'Dim oFile As FileInfo = New FileInfo(pdfPath)
''If (oFile.Exists) Then
'HttpContext.Current.Response.ClearHeaders()
'HttpContext.Current.Response.Clear()
'HttpContext.Current.Response.ClearContent()
'HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=""test.pdf""")
'HttpContext.Current.Response.Charset = System.Text.Encoding.UTF8.HeaderName
'Response.ContentEncoding = System.Text.Encoding.UTF8
''HttpContext.Current.Response.AddHeader("Content-Length", oFile.Length.ToString())
''HttpContext.Current.Response.AddHeader("Content-Length", arrByte.Length.ToString())
'HttpContext.Current.Response.ContentType = "application/pdf"
''HttpContext.Current.Response.ContentType = "application/download"
''HttpContext.Current.Response.ContentType = "application/octet-stream"
''HttpContext.Current.Response.BinaryWrite(arrByte)
''HttpContext.Current.Response.OutputStream.Write(arrByte, 0, arrByte.Length)
''HttpContext.Current.Response.TransmitFile(oFile.FullName, 0, oFile.Length)
'HttpContext.Current.Response.TransmitFile(oFile.FullName)
'HttpContext.Current.Response.Flush()
''File.Delete(pdfPath)
'HttpContext.Current.Response.End()
''End If
Private Sub LoadStreamToStream(ByVal inputStream As Stream, ByVal outputStream As Stream)
Const bufferSize As Integer = (64 * 1024)
Dim buffer As Object = New Byte((bufferSize) - 1) {}
While True
Dim bytesRead As Object = inputStream.Read(buffer, 0, bufferSize)
If (bytesRead > 0) Then
outputStream.Write(buffer, 0, bytesRead)
End If
If ((bytesRead = 0) _
OrElse (bytesRead < bufferSize)) Then
Exit While
End If
End While
End Sub
我已将三个 PDF 文件上传到 Mega,您可以在此链接中找到它们:
https://mega.co.nz/#!ORAhQDxb!ewotEFGNeecGXwm1V1rGyGy0apFGPSiZee_tYztYrCY
密码:pdfs9587
Right.pdf是使用 File.WriteAllBytes 创建的。
Wrong1.pdf是我尝试下载它时创建的,我添加了一个带有文件长度的标题。
Wrong2.pdf是响应的结果,没有将长度放在标题中。
我认为可能是长度标头是问题,但经过几次尝试后,我发现无论我使用哪种下载文件的方法,这两个错误都会重复出现。
但是,比较这三个文件,我认为带有长度标题的错误文件更接近正确的文件。
我希望你能给我一些建议或解决方案。
谢谢。