asp.Net出力docxドキュメントに「ファイルが破損して開けられない」という問題の解決策が現れた

1456 ワード

プロジェクトでは、添付ファイルドキュメントの一部をバイトストリームとしてデータベースに直接保存する必要があります.
機能が実現した後、多くのフォーマットファイルのアップロードダウンロード処理を試みたが、問題は発見されなかった.
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()