zoukankan      html  css  js  c++  java
  • 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()
    

      

  • 相关阅读:
    十一、异常处理&运行流程
    logback的使用和logback.xml详解
    十、拦截器
    word源代码解析(方便通过源码将word文件转换成html) 持续更新中
    laravel 打印sql
    利用workman进行回复指定用户指定内容
    js 根据val值获取对象key键值
    php添加邀请码
    微信支付退款流程 php
    解决ubuntu下修改环境变量profile后报错,很多常用命令都用不了
  • 原文地址:https://www.cnblogs.com/icycore/p/3253400.html
Copyright © 2011-2022 走看看