SpringMVC教程之文件(图片)下载浅谈

一、前言

前面一节,我们讲解了文件的上传,这一节我们就来说说如何实现下载功能。废话不多说,直接上代码吧。

web.xml,springmvc.xml,pom.xml 文件直接从前面一节拷贝过来。

二、案例

♦FilesDownloadHandler控制器类

/**
 * @author queen
 * @since 2017-11-22
 */
@RequestMapping("/filedownload")
@Controller
public class FilesDownloadHandler {
	/** 
	 * 列出所有的图片 
	 */  
	@RequestMapping("/listFile")  
	public String listFile(HttpServletRequest request,  
	        HttpServletResponse response) {  
	    // 获取上传文件的目录  
	    ServletContext sc = request.getSession().getServletContext();  
	    // 上传位置  
	    String uploadFilePath = sc.getRealPath("/uploads") + "/"; // 设定文件保存的目录  
	    // 存储要下载的文件名  
	    Map<String, String> fileNameMap = new HashMap<String, String>();  
	    // 递归遍历filepath目录下的所有文件和目录,将文件的文件名存储到map集合中  
	    listfile(new File(uploadFilePath), fileNameMap);// File既可以代表一个文件也可以代表一个目录  
	    // 将Map集合发送到listfile.jsp页面进行显示  
	    request.setAttribute("fileNameMap", fileNameMap);  
	    return "listFile";  
	}  
	
	public void listfile(File file, Map<String, String> map) {
		// 如果file代表的不是一个文件,而是一个目录
		if (!file.isFile()) {
			// 列出该目录下的所有文件和目录
			File files[] = file.listFiles();
			// 遍历files[]数组
			for (File f : files) {
				// 递归
				listfile(f, map);
			}
		} else {
			/**
			 * 处理文件名,上传后的文件是以uuid_文件名的形式去重新命名的,去除文件名的uuid_部分
			 * file.getName().indexOf
			 * ("_")检索字符串中第一次出现"_"字符的位置,如果文件名类似于:9349249849-88343-8344_阿_凡_达.avi
			 * 那么file.getName().substring(file.getName().indexOf("_")+1)
			 * 处理之后就可以得到
			 */
			String realName = file.getName().substring(
					file.getName().indexOf("_") + 1);
			// file.getName()得到的是文件的原始名称,这个名称是唯一的,因此可以作为key,realName是处理过后的名称,有可能会重复
			map.put(file.getName(), realName);
		}
	}
	
	@RequestMapping("/downFile")  
	public void downFile(HttpServletRequest request,  
	        HttpServletResponse response) {  
	    // 得到要下载的文件名  
	    String fileName = request.getParameter("filename");   
	    try {  
	        fileName = new String(fileName.getBytes("iso8859-1"), "UTF-8");  
	        // 获取上传文件的目录  
	        ServletContext sc = request.getSession().getServletContext();   
	        // 上传位置  
	        String fileSaveRootPath = sc.getRealPath("/uploads");   
	          
	        System.out.println(fileSaveRootPath + "\\" + fileName);  
	        // 得到要下载的文件  
	        File file = new File(fileSaveRootPath + "\\" + fileName);  
	          
	        // 如果文件不存在  
	        if (!file.exists()) {  
	            request.setAttribute("message", "您要下载的资源已被删除!!");  
	            System.out.println("您要下载的资源已被删除!!");  
	            return;  
	        }  
	        // 处理文件名  
	        String realname = fileName.substring(fileName.indexOf("_") + 1);  
	        // 设置响应头,控制浏览器下载该文件  
	        response.setHeader("content-disposition", "attachment;filename="  
	                + URLEncoder.encode(realname, "UTF-8"));  
	        // 读取要下载的文件,保存到文件输入流  
	        FileInputStream in = new FileInputStream(fileSaveRootPath + "\\" + fileName);  
	        // 创建输出流  
	        OutputStream out = response.getOutputStream();  
	        // 创建缓冲区  
	        byte buffer[] = new byte[1024];  
	        int len = 0;  
	        // 循环将输入流中的内容读取到缓冲区当中  
	        while ((len = in.read(buffer)) > 0) {  
	            // 输出缓冲区的内容到浏览器,实现文件下载  
	            out.write(buffer, 0, len);  
	        }  
	        // 关闭文件输入流  
	        in.close();  
	        // 关闭输出流  
	        out.close();  
	    } catch (Exception e) {  
	  
	    }  
	}  
}

♦编写listFile.jsp下载页面

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE HTML>
<html>
	<head>
		<title>下载图片显示页面</title>
	</head>
	<body>
		<!-- 遍历Map集合 -->
		<c:forEach var="me" items="${fileNameMap}">
			<c:url value="/filedownload/downFile" var="downurl">
				<c:param name="filename" value="${me.key}"></c:param>
			</c:url>  
	        ${me.value}<a href="${downurl}">下载</a><br />
		</c:forEach>
	</body>
</html>

♦启动运行

SpringMVC教程之文件(图片)下载浅谈的照片 - 1

点击下载按钮

SpringMVC教程之文件(图片)下载浅谈的照片 - 3

至此,我们关于SpringMVC教程之文件(图片)下载浅谈介绍完毕。想要了解更多关于SpringMVC开发的教程,请参考http://www.marsitman.com/springmvc
博客地址:http://www.marsitman.com/springmvc/springmvc-download.html
版权声明:本文为博主原创文章,允许转载,但转载必须标明出处。

 

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!



点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注