2013-07-09 54 views
0

我花了好幾天的時間試圖找到解決這個問題的方法,我也在網上搜索了我可以做的最好的,我不知道該怎麼辦,這個發生了什麼:ASPNET。簽名的PDF文件保存到SQL Server,檢索時出現問題

我已經簽署了PDF(我不知道這是否相關,但我提到它),並且我已經將其字節數組保存到varbinary字段中的SQL Server數據表中。

當我檢索數據時,我使用網絡方法File.WriteAllBytes在服務器中創建PDF,它可以工作,並且我得到簽名的PDF。

但是,如果我使用任何Response對象的方法來下載文件,或保存在數據庫(TransmitFileOutputStream.WriteBinaryWrite),我得到了一個空白的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是響應的結果,沒有將長度放在標題中。

我想也許長度標題是問題,但幾次嘗試後,我已經看到,無論用什麼方法下載我使用的文件,這兩個錯誤都會重複。

但是,比較這三個文件,我認爲錯誤的長度標題更接近正確的一個。

我希望你能給我一些建議或解決方案。

謝謝。

+0

PDF某處被認爲是文本並使用UTF-8編碼編寫。這不會發生,因爲它破壞了文件。我會建議刪除所有指示一些文本編碼的東西(尤其是表示UTF8的行)。 – mkl

+0

感謝您的建議。在添加編碼行之前,我僅使用傳輸或寫入文件的方法,但未成功。 這部分代碼創建一個有效的pdf: '文件。WriteAllBytes(pdfPath,arrByte) 'Dim oFile As FileInfo = New FileInfo(pdfPath) 但是所有關於Response對象(不管我做了多少更改)導致一個損壞的pdf: – blp

+0

最後我決定不要使用響應對象,並打開一個鏈接到我用File.WriteAllBytes方法創建的文件存儲在服務器中的虛擬目錄。我還沒有能夠通過響應來使它工作。 – blp

回答

0

最後,我決定不使用響應對象,並打開一個鏈接到服務器中的虛擬目錄,我用File.WriteAllBytes方法存儲創建的文件。我無法通過迴應使其工作。

相關問題