asp.Net出力docxドキュメントに「ファイルが破損して開けられない」という問題の解決策が現れた
1456 ワード
プロジェクトでは、添付ファイルドキュメントの一部をバイトストリームとしてデータベースに直接保存する必要があります.
機能が実現した後、多くのフォーマットファイルのアップロードダウンロード処理を試みたが、問題は発見されなかった.
docx形式のファイルをダウンロードした後、ファイルを開くと「ファイル***を開くことができません.内容が間違っています」というメッセージが表示されます.ファイルが破損し、開くことができません.
よく比較すると、データベース内の検索データセットで取得したバイトストリーム情報をbyte配列に直接割り当てると、配列の長さが実際のファイルのデータより1バイトも長くなることがわかりました.
そのため、ソリューションは、ファイルをアップロードするときに、ファイルのサイズをデータベースに格納することです.
ファイルを出力する場合は、データベースに格納されているサイズに準じて、バイナリストリームを実際のファイルフォーマットに出力します.
テストにより、この欠陥を解決できます.
機能が実現した後、多くのフォーマットファイルのアップロードダウンロード処理を試みたが、問題は発見されなかった.
docx形式のファイルをダウンロードした後、ファイルを開くと「ファイル***を開くことができません.内容が間違っています」というメッセージが表示されます.ファイルが破損し、開くことができません.
よく比較すると、データベース内の検索データセットで取得したバイトストリーム情報をbyte配列に直接割り当てると、配列の長さが実際のファイルのデータより1バイトも長くなることがわかりました.
そのため、ソリューションは、ファイルをアップロードするときに、ファイルのサイズをデータベースに格納することです.
ファイルを出力する場合は、データベースに格納されているサイズに準じて、バイナリストリームを実際のファイルフォーマットに出力します.
テストにより、この欠陥を解決できます.
Dim by As Byte() = dt.Rows(0)("fileContent")
HttpContext.Current.Response.ClearContent()
Dim sFileName As String = HttpUtility.UrlEncode(System.Text.UTF8Encoding.UTF8.GetBytes(dt.Rows(0)("fileName")))
Dim sExtension As String = pf.GetFileNameSuffix(sFileName)
HttpContext.Current.Response.ContentType = "application/octet-stream"
HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" + sFileName)
' ,
' (by.Length ) 1 , docx 。
HttpContext.Current.Response.AddHeader("Content-Length", dt.Rows(0)("fileSize").ToString())
HttpContext.Current.Response.BinaryWrite(by)
HttpContext.Current.Response.End()