spring boot 文件下载后无法打开

文件下载分为两部分:

File file = new File(downloadFilePath);

         if (file.exists()) {

             response.setContentType("application/force-download");// 设置强制下载不打开            

             response.addHeader("Content-Disposition", "attachment;fileName=" + fileName);

             byte[] buffer = new byte[1024];

             FileInputStream fis = null;

             BufferedInputStream bis = null;

             try {

                 fis = new FileInputStream(file);

                 bis = new BufferedInputStream(fis);

                 OutputStream outputStream = response.getOutputStream();

                 int i = bis.read(buffer);

                 while (i != -1) {

                     outputStream.write(buffer, 0, i);

                     i = bis.read(buffer);

                 }

                 return "下载成功";

其中一部分为设置httpresponse,固定格式。

另外需注意的是输入输出流拷贝时使用了一个byte[1024]的byte数组,如果是下载简单的txt文件不会引起问题,但是下载xlsx等复杂的用文本文档无法打开的文件时,会出现文件下载后无法打开的问题。推测原因是文件的大小基本上不会是1024的整数倍,那么最后一个byte[1024]复制过去时,尾巴上会有一些空白或者上一个byte[1024]残留的数据,导致整个文件的格式出错。

解决方法是替换拷贝方式:

 int i = bis.read(buffer);

                 while (i != -1) {

                     outputStream.write(buffer, 0, i);

                     i = bis.read(buffer);

                 }

改为

IOUtils.copy(bis,outputStream);直接拷贝整个输入输出流

或者

byte[] buffer = new byte[file.available()];将buffer数组设置为整个文件大小,一次性拷贝

你可能感兴趣的:(spring boot 文件下载后无法打开)