文件下载分为两部分:
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数组设置为整个文件大小,一次性拷贝