一.mvc+io流
java后台代码:
/**
* 使用io流拷贝文件到本地
* @param response
* @param fileName 文件名
* @param localFile 文件路径
* @throws FileNotFoundException
* @throws IOException
*/
public void useIODownloadFile(HttpServletResponse response, String fileName, String localFile)
throws FileNotFoundException, IOException {
response.setContentType("application/force-download");
response.setHeader("Content-Disposition", "attachment;fileName=" + fileName);
File downloadFile = new File(localFile);
FileInputStream inputStream = new FileInputStream(downloadFile);
IOUtils.copy(inputStream, response.getOutputStream());
response.flushBuffer();
}
注:IOUtil引自Apache.commons包
二.MVC+Nginx的sendFile方式
1.配置Nginx
打开sendFile功能:sendfile on;
添加如下配置:
location /protected {
internal;
alias /sftp/data;
}
解释:internal:禁止浏览器直接下载文件;
alias:使用别名,就是以后台代码的路径为准
/protected:虚拟路径
2.后台代码
/**
* 使用Nginx转发下载文件到本地(减少内存消耗)
* @param response
* @param fileName 文件名
* @param localFile 文件路径
*/
public void useNginxSendFile(HttpServletResponse response, String fileName, String localFile) {
response.setHeader("Content-Type", "application/octet-stream");
response.setHeader("X-Accel-Redirect", "/protected" + localFile);
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
}
三.两者比较
io流下载属于常规的做法,但是文件较大,下载量太多,应用服务器会压力变大,甚至崩溃
Nginx下载是利用web服务器的sendfile下载,减轻应用服务器压力,推荐用此方式下载