asp.net輸出docx文檔出現【文件已損壞 無法打開】問題的解決方案


在某個項目中,有個需求需要將一些附件文檔以字節流的形式直接存儲在數據庫中。

功能實現后,嘗試過很多格式文件的上傳下載處理,均未發現問題,

唯獨在下載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()

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM