我花了好幾天的時間試圖找到解決這個問題的方法,我也在網上搜索了我可以做的最好的,我不知道該怎麼辦,這個發生了什麼:ASPNET。簽名的PDF文件保存到SQL Server,檢索時出現問題
我已經簽署了PDF(我不知道這是否相關,但我提到它),並且我已經將其字節數組保存到varbinary字段中的SQL Server數據表中。
當我檢索數據時,我使用網絡方法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文件,兆豐,你可以在這個鏈接找到他們:
https://mega.co.nz/#!ORAhQDxb!ewotEFGNeecGXwm1V1rGyGy0apFGPSiZee_tYztYrCY
密碼:pdfs9587
Right.pdf是用File.WriteAllBytes創建的。
Wrong1.pdf是我嘗試下載它時創建的,我添加了一個包含文件長度的標頭。
Wrong2.pdf是響應的結果,沒有將長度放在標題中。
我想也許長度標題是問題,但幾次嘗試後,我已經看到,無論用什麼方法下載我使用的文件,這兩個錯誤都會重複。
但是,比較這三個文件,我認爲錯誤的長度標題更接近正確的一個。
我希望你能給我一些建議或解決方案。
謝謝。
PDF某處被認爲是文本並使用UTF-8編碼編寫。這不會發生,因爲它破壞了文件。我會建議刪除所有指示一些文本編碼的東西(尤其是表示UTF8的行)。 – mkl
感謝您的建議。在添加編碼行之前,我僅使用傳輸或寫入文件的方法,但未成功。 這部分代碼創建一個有效的pdf: '文件。WriteAllBytes(pdfPath,arrByte) 'Dim oFile As FileInfo = New FileInfo(pdfPath) 但是所有關於Response對象(不管我做了多少更改)導致一個損壞的pdf: – blp
最後我決定不要使用響應對象,並打開一個鏈接到我用File.WriteAllBytes方法創建的文件存儲在服務器中的虛擬目錄。我還沒有能夠通過響應來使它工作。 – blp