以上的错误,包括txt这种简单格式,或者excel这种格式,都会出现问题的
但是部分是不会出现问题的,比如word的文件,受到被保护的视图的时候,就不会出现问题
如以下文件,就不会出现下载后打开异常的问题
核心:
其实配置这个还是很简单的,核心就是response.setHeader(“Content-Disposition”, “attachment;filename=”,这个的解释呢,就是
Content-disposition 是 MIME 协议的扩展,MIME 协议指示 MIME 用户代理如何显示附加的文件。当 Internet Explorer 接收到头时,它会激活文件下载对话框,它的文件名框自动填充了头中指定的文件名。(请注意,这是设计导致的;无法使用此功能将文档保存到用户的计算机上,而不向用户询问保存位置。)
Content-disposition:以什么格式打开响应体数据(inline默认当前页面打开;attachment;filename=xxx 以附件形式打开响应体,文件下载)
在controller层的方法上贴上 @ApiOperation
主要的注解就是 @ApiOperation(value = “将数据库转换为word文档”,produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
具体来说,就是说明采用流下载 application/octet-stream,其中还有json和表单等。
但是对于swagger来说,produces是不需要进行配置的,会自动进行识别
这里说的就是第二步了,就是响应体,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"); 即可
如果一定要设置比较精确的格式,可以参考以下的说明。
Ext | MIME Type |
---|---|
.doc | application/msword |
.dot | application/msword |
.docx | application/vnd.openxmlformats-officedocument.wordprocessingml.document |
.dotx | application/vnd.openxmlformats-officedocument.wordprocessingml.template |
。。。 | 。。。 |
查看更多,请看文尾
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();
}
以上就是最核心的代码。
在D盘创建toWord文件
下载文件toWordTest.doc文件之后,打开依然会报错。
从上述可以知道,我们对swagger的配置,或者对 响应头的配置,是没有问题的。
为了证明我们没问题,我采用了 postman进行测试,结果是可以打开的
发现postman下载的文件,是可以打开,并且正确显示内容的
基本可以得出结论,是swagger的问题,而不是我们代码的问题
我花了一整天查找问题, 从代码中,以及word文档的格式中,都查找过了,最后,关注了swagger2的版本
我发现目前使用的swagger2版本为 2.6.1.
更新swagger2版本为 2.9.2 之后,我再尝试下载
swagger2下载文件打开异常,百度了很多网友的方案,基本没有很好的解决方案,我只能自己进行解决。
下载文件之后打开异常,本来就是swagger2本身的问题,我之前一直在纠结代码的问题,反反复复导致自己特别的累,但是换一个角度看,还是收获满满。
大部分的程序员,都是面向百度或者谷歌进行编程的,而网上的资料乱七八糟,有时候找起来让人难受,于是本人无偿进行资料收集的工作,大部分资料都是本人实打实收集的而且测试过,大家不用怀疑准确性,奈何能力有限,免于遗漏,希望读者可以在评论或者私信我,进行改正,大家一起为互联网技术做贡献。
收集资料枯燥无味,如果本文对你有帮助,可以点个赞,这个也是对我最大的鼓励和赞许。
本人行不改名坐不改姓,潮汕的灿灿展
立志在互联网这一行,做出自己的贡献
Ext | MIME Type |
---|---|
.doc | application/msword |
.dot | application/msword |
.docx | application/vnd.openxmlformats-officedocument.wordprocessingml.document |
.dotx | application/vnd.openxmlformats-officedocument.wordprocessingml.template |
.docm | application/vnd.ms-word.document.macroEnabled.12 |
.dotm | application/vnd.ms-word.template.macroEnabled.12 |
.xls | application/vnd.ms-excel |
.xlt | application/vnd.ms-excel |
.xla | application/vnd.ms-excel |
.xlsx | application/vnd.openxmlformats-officedocument.spreadsheetml.sheet |
.xltx | application/vnd.openxmlformats-officedocument.spreadsheetml.template |
.xlsm | application/vnd.ms-excel.sheet.macroEnabled.12 |
.xltm | application/vnd.ms-excel.template.macroEnabled.12 |
.xlam | application/vnd.ms-excel.addin.macroEnabled.12 |
.xlsb | application/vnd.ms-excel.sheet.binary.macroEnabled.12 |
.ppt | application/vnd.ms-powerpoint |
.pot | application/vnd.ms-powerpoint |
.pps | application/vnd.ms-powerpoint |
.ppa | application/vnd.ms-powerpoint |
.pptx | application/vnd.openxmlformats-officedocument.presentationml.presentation |
.potx | application/vnd.openxmlformats-officedocument.presentationml.template |
.ppsx | application/vnd.openxmlformats-officedocument.presentationml.slideshow |
.ppam | application/vnd.ms-powerpoint.addin.macroEnabled.12 |
.pptm | application/vnd.ms-powerpoint.presentation.macroEnabled.12 |
.potm | application/vnd.ms-powerpoint.presentation.macroEnabled.12 |
.ppsm | application/vnd.ms-powerpoint.slideshow.macroEnabled.12 |