swagger2文件下载word或者excel报错或者其他文件格式错误的解决方案

本文档详细记录了在使用Swagger2时遇到的文件下载后打开异常的问题,通过分析配置和响应头,发现问题并非代码错误,而是Swagger2版本过低。升级Swagger2至2.9.2以上版本后,问题得到解决。内容涵盖了如何配置文件下载,包括Content-Disposition的设置和文件类型的指定。
摘要由CSDN通过智能技术生成

一、问题的说明以及结论的摆出

swagger下载的地方
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7kk7FwW6-1609405441815)(2020-12-31-10-37-38.png)]
在这里插入图片描述

无法读取的内容,是否恢复此文档的内容
在这里插入图片描述

视图打开时遇到错误
在这里插入图片描述

以上的错误,包括txt这种简单格式,或者excel这种格式,都会出现问题的

但是部分是不会出现问题的,比如word的文件,受到被保护的视图的时候,就不会出现问题

如以下文件,就不会出现下载后打开异常的问题

在这里插入图片描述
以下是总体流程以及解决办法的说明

二、如何配置文件到swagger进行下载的方法

核心:

  • 其实配置这个还是很简单的,核心就是response.setHeader(“Content-Disposition”, “attachment;filename=”,这个的解释呢,就是

  • Content-disposition 是 MIME 协议的扩展,MIME 协议指示 MIME 用户代理如何显示附加的文件。当 Internet Explorer 接收到头时,它会激活文件下载对话框,它的文件名框自动填充了头中指定的文件名。(请注意,这是设计导致的;无法使用此功能将文档保存到用户的计算机上,而不向用户询问保存位置。)

  • Content-disposition:以什么格式打开响应体数据(inline默认当前页面打开;attachment;filename=xxx 以附件形式打开响应体,文件下载)

2.1 从 swagger2 的配置说起

在controller层的方法上贴上 @ApiOperation

主要的注解就是 @ApiOperation(value = “将数据库转换为word文档”,produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)

具体来说,就是说明采用流下载 application/octet-stream,其中还有json和表单等。

但是对于swagger来说,produces是不需要进行配置的,会自动进行识别

2.2 从响应头开始说起

这里说的就是第二步了,就是响应体,HttpServletResponse response

    @ApiOperation(value = "将数据库转换为word文档",produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
    @RequestMapping(value = "/dbToWord", method = {RequestMethod.GET})
    public void getWord(DBVO dbvo,HttpServletResponse response) {
    
    }

方法注入了HttpServletResponse,对影响体进行设置。

设置的东西,主要是两个,一个是 编码格式,一般设置为 utf-8。另一个设置文件是什么格式的。

response.setCharacterEncoding("utf-8"); //设置编码格式
response.setContentType("application/msword"); //标识为word文档

以上说明,对于我们来说,我们并不需要设置文件是什么格式,如果是文件,统一表示流格式就可以,像我们不知道文件是什么格式,统一设置为:

response.setContentType("application/octet-stream"); 即可

如果一定要设置比较精确的格式,可以参考以下的说明。

ExtMIME Type
.docapplication/msword
.dotapplication/msword
.docxapplication/vnd.openxmlformats-officedocument.wordprocessingml.document
.dotxapplication/vnd.openxmlformats-officedocument.wordprocessingml.template
。。。。。。

查看更多,请看文尾

2.2.1 返回文件的名字以及设置响应体中的流文件

String fileName = "dbToWord"; //文件名字,设置之后,下载的文件就是按照这个文件名进行设置的
String outFile = "D:/toWord.docx";
try (OutputStream outputStream = response.getOutputStream()) {
    response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName + ".doc", "utf-8")); //一方面是保证支持中文文件名,另一方面是真正进行名字的设置
    Files.copy(Paths.get(outFile),outputStream);
} catch (IOException e) {
    e.printStackTrace();
}

以上就是最核心的代码。

3 整体案例,读取本地的文件送到swagger2中进行下载。

在D盘创建toWord文件

运行结果
在这里插入图片描述

下载文件toWordTest.doc文件之后,打开依然会报错。
在这里插入图片描述

三、打开文件报错的反思,以及最终解决办法

从上述可以知道,我们对swagger的配置,或者对 响应头的配置,是没有问题的。

为了证明我们没问题,我采用了 postman进行测试,结果是可以打开的

如图
在这里插入图片描述

发现postman下载的文件,是可以打开,并且正确显示内容的

在这里插入图片描述

基本可以得出结论,是swagger的问题,而不是我们代码的问题

四、最终解决办法,更新swagger版本为 2.9.2 以上

我花了一整天查找问题, 从代码中,以及word文档的格式中,都查找过了,最后,关注了swagger2的版本

我发现目前使用的swagger2版本为 2.6.1.

更新swagger2版本为 2.9.2 之后,我再尝试下载

在这里插入图片描述

在这里插入图片描述

五、写在最后

swagger2下载文件打开异常,百度了很多网友的方案,基本没有很好的解决方案,我只能自己进行解决。

下载文件之后打开异常,本来就是swagger2本身的问题,我之前一直在纠结代码的问题,反反复复导致自己特别的累,但是换一个角度看,还是收获满满。

大部分的程序员,都是面向百度或者谷歌进行编程的,而网上的资料乱七八糟,有时候找起来让人难受,于是本人无偿进行资料收集的工作,大部分资料都是本人实打实收集的而且测试过,大家不用怀疑准确性,奈何能力有限,免于遗漏,希望读者可以在评论或者私信我,进行改正,大家一起为互联网技术做贡献。


收集资料枯燥无味,如果本文对你有帮助,可以点个赞,这个也是对我最大的鼓励和赞许。

本人行不改名坐不改姓,潮汕的灿灿展

立志在互联网这一行,做出自己的贡献


附录

ExtMIME Type
.docapplication/msword
.dotapplication/msword
.docxapplication/vnd.openxmlformats-officedocument.wordprocessingml.document
.dotxapplication/vnd.openxmlformats-officedocument.wordprocessingml.template
.docmapplication/vnd.ms-word.document.macroEnabled.12
.dotmapplication/vnd.ms-word.template.macroEnabled.12
.xlsapplication/vnd.ms-excel
.xltapplication/vnd.ms-excel
.xlaapplication/vnd.ms-excel
.xlsxapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet
.xltxapplication/vnd.openxmlformats-officedocument.spreadsheetml.template
.xlsmapplication/vnd.ms-excel.sheet.macroEnabled.12
.xltmapplication/vnd.ms-excel.template.macroEnabled.12
.xlamapplication/vnd.ms-excel.addin.macroEnabled.12
.xlsbapplication/vnd.ms-excel.sheet.binary.macroEnabled.12
.pptapplication/vnd.ms-powerpoint
.potapplication/vnd.ms-powerpoint
.ppsapplication/vnd.ms-powerpoint
.ppaapplication/vnd.ms-powerpoint
.pptxapplication/vnd.openxmlformats-officedocument.presentationml.presentation
.potxapplication/vnd.openxmlformats-officedocument.presentationml.template
.ppsxapplication/vnd.openxmlformats-officedocument.presentationml.slideshow
.ppamapplication/vnd.ms-powerpoint.addin.macroEnabled.12
.pptmapplication/vnd.ms-powerpoint.presentation.macroEnabled.12
.potmapplication/vnd.ms-powerpoint.presentation.macroEnabled.12
.ppsmapplication/vnd.ms-powerpoint.slideshow.macroEnabled.12
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值