基于SpringMVC的文件下载实例-创新互联

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

创新互联公司专注于企业全网整合营销推广、网站重做改版、高港网站定制设计、自适应品牌网站建设、html5商城网站开发、集团公司官网建设、成都外贸网站制作、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为高港等各大城市提供网站开发制作服务。

注: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这个文件中添加一个文件下载的超链接:

头像下载

点击下载

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

基于SpringMVC的文件下载实例

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

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

@RequestMapping(value = "/download", method = { RequestMethod.GET, RequestMethod.POST })
	public ResponseEntity 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(FileUtils.readFileToByteArray(pic), headers, HttpStatus.CREATED);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		
		return null;
	}

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

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

基于SpringMVC的文件下载实例

创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。


分享标题:基于SpringMVC的文件下载实例-创新互联
本文URL:http://ybzwz.com/article/cccpio.html