热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

asp.net输出docx文档出现【文件已损坏无法打开】问题的解决方案

在某个项目中,有个需求需要将一些附件文档以字节流的形式直接存储在数据库中。功能实现后,尝试过很多格式文件的上传下载处理,均未发现问题&#x

在某个项目中,有个需求需要将一些附件文档以字节流的形式直接存储在数据库中。

功能实现后,尝试过很多格式文件的上传下载处理,均未发现问题,

唯独在下载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()

  

 

转:https://www.cnblogs.com/icycore/p/3253400.html



推荐阅读
  • Spring 中策略模式的应用:Resource 接口详解
    本文探讨了在 Spring 框架中如何利用 Resource 接口实现资源访问策略。Resource 接口作为资源访问策略的抽象,通过多种实现类支持不同类型的资源访问。 ... [详细]
  • 阿里云 Aliplayer高级功能介绍(八):安全播放
    如何保障视频内容的安全,不被盗链、非法下载和传播,阿里云视频点播已经有一套完善的机 ... [详细]
  • C#实现文件的压缩与解压
    2019独角兽企业重金招聘Python工程师标准一、准备工作1、下载ICSharpCode.SharpZipLib.dll文件2、项目中引用这个dll二、文件压缩与解压共用类 ... [详细]
  • 浅析python实现布隆过滤器及Redis中的缓存穿透原理_python
    本文带你了解了位图的实现,布隆过滤器的原理及Python中的使用,以及布隆过滤器如何应对Redis中的缓存穿透,相信你对布隆过滤 ... [详细]
  • 可参照github代码:https:github.comrabbitmqrabbitmq-tutorialsblobmasterjavaEmitLogTopic.ja ... [详细]
  • 四、作为您的 VCS 的 GitHub ... [详细]
  • 本文详细介绍如何在忘记MySQL服务器密码的情况下进行密码重置,包括具体的步骤和注意事项。 ... [详细]
  • 本文介绍了Go语言中正则表达式的基本使用方法,并提供了一些实用的示例代码。 ... [详细]
  • C语言编写线程池的简单实现方法
    2019独角兽企业重金招聘Python工程师标准好文章,一起分享——有时我们会需要大量线程来处理一些相互独立的任务,为了避免频繁的申请释放线程所带 ... [详细]
  • 本文详细介绍了 Spark 中的弹性分布式数据集(RDD)及其常见的操作方法,包括 union、intersection、cartesian、subtract、join、cogroup 等转换操作,以及 count、collect、reduce、take、foreach、first、saveAsTextFile 等行动操作。 ... [详细]
  • malloc 是 C 语言中的一个标准库函数,全称为 memory allocation,即动态内存分配。它用于在程序运行时申请一块指定大小的连续内存区域,并返回该区域的起始地址。当无法预先确定内存的具体位置时,可以通过 malloc 动态分配内存。 ... [详细]
  • 本文详细介绍了Linux系统中用于管理IPC(Inter-Process Communication)资源的两个重要命令:ipcs和ipcrm。通过这些命令,用户可以查看和删除系统中的消息队列、共享内存和信号量。 ... [详细]
  • 我有一个从C项目编译的.o文件,该文件引用了名为init_static_pool ... [详细]
  • HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送www方式的数据。HTTP协议采用了请求响应模型。客服端向服务器发送一 ... [详细]
  • 本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ... [详细]
author-avatar
手机用户2602917083
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有