基于SpringMVC的文件下载实例

文件的下载和文件的上传一样都是Web应用中一个重要的功能点。这篇“SpingMVC的文件下载”是基于以前写过的那篇“SpringMVC实现文件上传”写的,因此这里就不从头开始搭建测试项目了,直接接着上次的那个项目来进行测试,因此看这篇文章之前需要简单浏览下上次的那篇文章

注:SpringMVC实现文件上传:http://www.zifangsky.cn/406.html

(1)在UploadController.java这个controller里的upload方法中添加返回上传之后的文件的文件名:

modelAndView.addObject("picName", targetFileName);

添加之后,这个方法的完整代码如下:

	@RequestMapping(value = "/upload", method = RequestMethod.POST)
	public ModelAndView upload(User user, @RequestParam("file") MultipartFile tmpFile, HttpServletRequest request) {
		ModelAndView modelAndView = new ModelAndView("fileupload");

		if (tmpFile != null) {
			// 获取物理路径
			String targetDirectory = request.getSession().getServletContext().getRealPath("/uploads");
			String tmpFileName = tmpFile.getOriginalFilename(); // 上传的文件名
			int dot = tmpFileName.lastIndexOf(‘.‘);
			String ext = ""; // 文件后缀名
			if ((dot > -1) && (dot < (tmpFileName.length() - 1))) {
				ext = tmpFileName.substring(dot + 1);
			}
			// 其他文件格式不处理
			if ("png".equalsIgnoreCase(ext) || "jpg".equalsIgnoreCase(ext) || "gif".equalsIgnoreCase(ext)) {
				// 重命名上传的文件名
				String targetFileName = StringUtile.renameFileName(tmpFileName);
				// 保存的新文件
				File target = new File(targetDirectory, targetFileName);

				try {
					// 保存文件
					FileUtils.copyInputStreamToFile(tmpFile.getInputStream(), target);
				} catch (IOException e) {
					e.printStackTrace();
				}

				User u = new User();
				u.setUserName(user.getUserName());
				u.setLogoSrc(request.getContextPath() + "/uploads/" + targetFileName);

				modelAndView.addObject("u", u);
				modelAndView.addObject("picName", targetFileName);
			}

			return modelAndView;
		}

		return modelAndView;
	}

(2)在fileupload.jsp这个文件中添加一个文件下载的超链接:

<h2>头像下载</h2>
	<a href="download.html?fileName=${picName}">点击下载</a>

可以看出,这里的fileName就是用的controller中的“picName”来赋值的

注:代码添加的位置如上图所示

(3)在UploadController.java中添加一个用于下载文件的方法,代码如下:

	@RequestMapping(value = "/download", method = { RequestMethod.GET, RequestMethod.POST })
	public ResponseEntity<byte[]> download(@RequestParam(name = "fileName") String fileName,
			HttpServletRequest request) {
		HttpHeaders headers = new HttpHeaders();
		Pattern pattern = Pattern.compile("\\w*\\.\\w+");
		Matcher matcher = pattern.matcher(fileName);

		//检查文件名中非法字符,只允许是字母、数字和下划线
		if (matcher.matches()) {
			try {
				headers.setContentDispositionFormData("myfile", fileName);
				headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
				// 获取物理路径
				String filePath = request.getSession().getServletContext().getRealPath("/uploads");
				File pic = new File(filePath, fileName);
				return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(pic), headers, HttpStatus.CREATED);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

		return null;
	}

注:从上面的代码可以看出,通过接收表示文件名的字符串然后跟文件的路径拼接起来,形成文件在磁盘中真实路径的File对象,最后返回文件的流并进行下载。需要注意的是,为了防止出现任意文件下载,导致下载到其他路径中的文件,因此在下载之前校验了文件名的格式。同时最后返回了一个ResponseEntity<byte[]>类型的数据,是为了在返回数据流的同时返回我们自定义的HttpHeaders和HttpStatus

(4)最后下载的效果如下:

时间: 2024-10-12 04:10:36

基于SpringMVC的文件下载实例的相关文章

SpringMVC详解(三)------基于注解的入门实例

前两篇博客我们讲解了基于XML 的入门实例,以及SpringMVC运行的详细流程.但是我们发现基于 XML 的配置还是比较麻烦的,而且,每个 Handler 类只能有一个方法,在实际开发中肯定是不可能这样来进行开发的.那么这篇博客我们就讲解实际开发中用的最多的基于注解配置的SpringMVC配置. 本篇博客源码下载 项目结构为: 1.在 web.xml 文件中配置前端处理器 <?xml version="1.0" encoding="UTF-8"?> &

SpringMVC应用------基于注解的入门实例

SpringMVC应用------基于注解的入门实例 目录 1.在 web.xml 文件中配置前端处理器 2.在 springmvc.xml 文件中配置处理器映射器,处理器适配器,视图解析器 3.编写 Handler 4.编写 视图 index.jsp 5.在浏览器中输入:http://localhost:8080/SpringMVC-003/hello 前两篇博客我们讲解了基于XML 的入门实例,以及SpringMVC运行的详细流程.但是我们发现基于 XML 的配置还是比较麻烦的,而且,每个

将 Shiro 作为应用的权限基础 二:基于SpringMVC实现的认证过程

认证就是验证用户身份的过程.在认证过程中,用户需要提交实体信息(Principals)和凭据信息(Credentials)以检验用户是否合法.最常见的“实体/凭证”组合便是“用户名/密码”组合. 一.认证过程 1.收集实体/凭据信息 Java代码 UsernamePasswordToken token = new UsernamePasswordToken(username, password); token.setRememberMe(true); UsernamePasswordToken支

SpringMVC+Apache Shiro+JPA(hibernate)案例教学(二)基于SpringMVC+Shiro的用户登录权限验证

序: 在上一篇中,咱们已经对于项目已经做了基本的配置,这一篇文章开始学习Shiro如何对登录进行验证. 教学: 一.Shiro配置的简要说明. 有心人可能注意到了,在上一章的applicationContext.xml配置文件中,包含以下配置. <!-- 項目自定义的Realm --> <bean id="shiroDbRealm" class="org.shiro.demo.service.realm.ShiroDbRealm" ><

Java基于springMVC的验证码案例

1 ``` 2 Java验证码案例(基于springMVC方式) 3 4 验证码工具类 5 package com.ekyb.common.util; 6 7 import java.awt.Color; 8 import java.awt.Font; 9 import java.awt.Graphics; 10 11 import java.awt.image.BufferedImage; 12 import java.util.ArrayList; 13 import java.util.A

SpringMVC经典系列-12基于SpringMVC的文件上传---【LinusZhu】

注意:此文章是个人原创,希望有转载需要的朋友们标明文章出处,如果各位朋友们觉得写的还好,就给个赞哈,你的鼓励是我创作的最大动力,LinusZhu在此表示十分感谢,当然文章中如有纰漏,请联系[email protected],敬请朋友们斧正,谢谢. 不知不觉已经把Spring的基础部分讲解完了,所讲述的都是在项目中经常用到的东西,是经得住考验的,接下来的部分主要是要讲述使用SpringMVC进行的文件上传.处理Ajax请求.自定义拦截器功能的实现,不多说了,首先讲解文件上传部分,开始--     

主题:基于springMVC+springSecurity3.x+Mybaits3.x的权限系统,,

在平时的空闲时,自己做了一个权限管理系统,细粒度控制,支持控制到按扭!支持开源!分享知识! 很久之前就想把自己所学到的知识以及项目所用的技术集结起来,之前太忙了,一直没有动手做,这段时间有点闲,就把一个系统的基本要素功能做了出来,发现自己又懂得很多!其中也遇到不少困难和问题,但最终还是一一解决了!经验就是这样得来的!哈哈!我的博客有很多文章都是在项目中遇到问题以及解决办法写下来的!写得不好不要喷口水哈!如果觉得好的就 赞一下!谢谢! 以下的作品都是自己呕心沥血做出来的,源码中有很多注释,都是自己

vc 基于对话框多线程编程实例——线程之间的通信

 vc基于对话框多线程编程实例--线程之间的通信 实例: vc 基于对话框多线程编程实例--线程之间的通信,码迷,mamicode.com

基于SpringMVC下的Rest服务框架搭建【1、集成Swagger】

基于SpringMVC下的Rest服务框架搭建[1.集成Swagger] 1.需求背景 SpringMVC本身就可以开发出基于rest风格的服务,通过简单的配置,即可快速开发出一个可供客户端调用的rest服务,通常这些服务要不就是用于手机app的开发,要不就是提供给第三方开发者使用,不管哪种情况,你都需要提供详细的说明给别人,而Swagger就是为这种情况而生的,通过在接口上的注解,生成可供第三方模拟测试和阅读的接口列表,既美观又使用,真是行走江湖之必备良药. [XmPlatform原创,转载的