在某個項目中,有個需求需要將一些附件文檔以字節流的形式直接存儲在數據庫中。
功能實現后,嘗試過很多格式文件的上傳下載處理,均未發現問題,
唯獨在下載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()