0

我花了几天时间试图找到这个问题的解决方案,我也尽我所能在网上搜索,但我不知道还能做什么,这就是发生的事情:

我已经签署了一个 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是响应的结果,没有将长度放在标题中。

我认为可能是长度标头是问题,但经过几次尝试后,我发现无论我使用哪种下载文件的方法,这两个错误都会重复出现。

但是,比较这三个文件,我认为带有长度标题的错误文件更接近正确的文件。

我希望你能给我一些建议或解决方案。

谢谢。

4

1 回答 1

0

最后,我决定不使用响应对象并打开一个指向服务器中虚拟目录的链接,在该目录中存储使用 File.WriteAllBytes 方法创建的文件。我无法通过响应使其工作。

于 2013-07-10T11:15:42.310 回答