一、直接贴代码:
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
@RestController
@RequestMapping()
public class FileController {
/**
* 下载文件
*
* @param request
* @param response
* @return
*/
@RequestMapping(value = "fileDownload")
public String fileDownload(HttpServletRequest request, HttpServletResponse response) {
// 文件名称
String fileName = request.getParameter("fileName");
// 文件
File file = new File("D:/upload/" + fileName);
// urlencode
try {
// 避免下载时文件名为中文时,出现乱码
fileName = URLEncoder.encode(fileName, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
// TODO
}
// 文件是否存在
if (file.exists()) {
response.setContentType("application/force-download");
response.setCharacterEncoding("UTF-8");
// 这里可以重置文件名,比如fileName=aa.jpeg,那么下载下来的文件名称即为aa.jpeg
response.setHeader("Content-Disposition", "attachment;fileName=" + fileName);
byte[] buffer = new byte[1024];
FileInputStream fis = null; //文件输入流
BufferedInputStream bis = null;
OutputStream os = null; //输出流
try {
os = response.getOutputStream();
fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
int i = bis.read(buffer);
while(i != -1){
os.write(buffer);
i = bis.read(buffer);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
bis.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} else {
return "";
}
// 这里返回null。不返回null的话,文件下载成功,但是运行日志里有异常
return null;
}
}
二、其它说明
1,下载时,一定要对文件名称进行urlencode,这样可以避免下载下来的文件名出现中文乱码的情况。
2,这里返回值为null是有原因的。
因为我自己也没理解透彻,下面的可以直接忽略。
个人认为导致的原因:
响应请求的本质是向外输出流,流输出完,即表示响应完成,整个请求处理完成
可以想想刚接触servlet的时候,我们是怎么输出内容的