使用http response编写附件下载功能,当附件是docx时,用office的word打开,会出现文件损坏,是否修复的错误,点击修复又能正常打开。

首先,仔细对比文件发现,下载下来的文件比服务器上的文件多了12个字节,由此可以推断,在IO流写入的时候字节写多了,百度了一番,大部分都说写流的时候控制一下长度。

os.write(buffer, 0, len)的时候要注意不要写os.write(buffer),但是我本身就是按照长度来写的。

最后,尝试设置了一下response contentLength,问题得到解决。

response.setContentLength((int) file.length());

为什么想到了设置contentLength,因为在做feign的时候,做过request的转发,当时设置过contentLength,导致报错,所以这次response的时候尝试了一下,还真行。

File file = new File(toFile);// 如果文件存在,则进行下载if (file.exists()) {// 配置文件下载
//                response.setHeader("content-type", "application/octet-stream");
//                response.setContentType("application/octet-stream");//  response.setCharacterEncoding("UTF-8");String mineType = new MimetypesFileTypeMap().getContentType(file.getName());response.setContentLength((int) file.length());response.setContentType(mineType);// 下载文件能正常显示中文response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(file.getName(), "UTF-8"));// 实现文件下载byte[] buffer = new byte[1024];FileInputStream fis = null;BufferedInputStream bis = null;try {fis = new FileInputStream(file);bis = new BufferedInputStream(fis);OutputStream os = response.getOutputStream();int i = bis.read(buffer);while (i > 0) {os.write(buffer, 0, i);i = bis.read(buffer);}message = "解密成功";sysLog.setMessage(message);sysLog.setFlag("1");logService.saveLog(sysLog);logger.info(sourceFile+"Download  successfully!");return "successfully";} catch (Exception e) {e.printStackTrace();message = "下载失败";sysLog.setMessage(message);logger.error(sysLog.getAppCode()+"="+message,e);logService.saveLog(sysLog);throw new BaseException(500,message);} finally {if (bis != null) {try {bis.close();} catch (IOException e) {e.printStackTrace();}}if (fis != null) {try {fis.close();} catch (IOException e) {e.printStackTrace();}}}}

java response下载docx,报文件损坏是否修复,ContentLength导致的相关推荐

  1. java csv文件tozip后损坏_java上传并下载以及解压zip文件有时会报文件被损坏错误分析以及解决...

    情景描述: 1.将本地数据备份成zip文件: 2.将备份的zip文件通过sftp上传到文件服务器: 3.将文件服务器上的zip文件下载到运行服务器: 4.将下载的zip文件解压到本地(文件大小超过50 ...

  2. 使用FileOutPutStream下载docx文件报文件已损坏解决

    代码发布到linux之后,通过接口下载了文件,打开文件提示文件已损坏,但是强行打开却是可以看到内容的,很奇怪. 在网上也找了好多办法,没能解决,最终是在响应头里加入一个Length之后,下载文件打开不 ...

  3. 文件被损坏 java_使用PDF.JS实现pdf文件在线预览时,报文件被损坏的错误

    首先大概说明一下问题出现的背景:我用PDF.JS实现文件在线预览,参考网上的办法,在jsp文件中使用 ?file=" width="1024" height=" ...

  4. Axios下载docx 显示文件无法打开和文件损坏

    起因描述 做一个web下载docx的功能,后台读取文件,Response写流,到前端通过Blob创建下载链接,一切正常 但是最后发现文件下载后就打不开了,显示需要修复,修复后就可以打开了 各种查找,基 ...

  5. php下载docx打不开,使用PHPWord下载DOCX文件时获取损坏的文件 - php

    我正在尝试使用" PHPWord"下载docx文件. 如果我尝试将文件保存到服务器上,则可以正常工作.但是,如果添加标题以下载文件,则文件将以损坏的形式显示. 注意:我正在使用op ...

  6. 转 IE 下载docx xlsx 文件另存为zip文件

    转 IE 下载docx xlsx 文件另存为zip文件 - [Apache]http://tonado.blogbus.com/logs/44587006.html 伟大的Microsoft迄今为止还 ...

  7. java struts2下载文件_java struts2入门学习---文件下载的二种方式

    一.关于文件下载: 文件下载的核心思想即是将文件从一个地方拷贝到另一个地方. 1.传统方式: 在Action中加入大量servlet api 操作.优点是好理解,缺点是耦合度高. 2.stream方式 ...

  8. upupoo视频使用Java代码下载

    upupoo视频使用Java代码下载 Upupoo有防爬,但是你只需要模拟请求添加个请求头Referer:http://www.upupoo.com/就可以了. <dependency>& ...

  9. springboot打成Jar包下载Excel模板文件损坏问题

    最近遇到Springboot环境项目打成jar后下载Excle文件出现损坏问题,我是在网上找了这种方法解决的: String fileName = "aaa.xlsx"; Clas ...

最新文章

  1. hadoop HA集群搭建(亲测)
  2. 中国的程序员们是否要声援微软小冰?
  3. 我不知道风是在哪一个方向吹
  4. sys.getsizeof(), 字节之间的换算关系
  5. 英伟达RTX 3080值不值得抢?在TensorFlow上训练了卷积网络
  6. 微信小程序中如何使用setData修改数组或对象中的某一参数
  7. 配置文件中有“路径信息”时,需呀注意的问题(路径中的\是转义字符)~
  8. [翻译]XNA在线俱乐部网站即将开站!
  9. Ubuntu14.10安装Eclipse
  10. 【电路仿真】基于simulink模拟锁相环设计【含Matlab源码 339期】
  11. Scrapy爬虫项目的创建及案例
  12. axure怎么存html文件怎么打开,axure 保存html文件怎么打开
  13. 简易支付系统的架构设计
  14. java 在图片上添加文字或图片
  15. python_判断是否回文
  16. supersu_如何使用SuperSU和TWRP扎根Android手机
  17. Oracle SPARC T5-2 服务器:硬件规格
  18. 关于sungard和博彦的笔试
  19. 解决硬盘自动休眠问题
  20. Compose主题切换——让你的APP也能一键换肤

热门文章

  1. 【炼数成金-机器学习笔记】
  2. 用户体验是个什么东西?用户体验如何评价好坏?怎样用一句话描述用户体验评价方法的核心?
  3. 英雄远征Erlang源码分析(7)-场景与副本
  4. 突发奇想之 Planning Trajectory
  5. 实操案例:机智云调试APP控制云端虚拟设备
  6. Unity 自动制作LowPoly随机形态的树预制体工具
  7. C# WinForm开发框架
  8. 抱歉回复晚了,英语怎么说?
  9. 轻松搞定DnsPod域名解析设置
  10. MQTT协议图解,一文看懂MQTT协议数据包(真实报文数据解析解释)