文件下载功能实现的两种方式

一.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下载,减轻应用服务器压力,推荐用此方式下载


版权声明:本文为hero_hope原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。