博客
关于我
(六)SpringMVC文件上传和下载(显示一个路径下的所有可下载文件)
阅读量:351 次
发布时间:2019-03-04

本文共 5253 字,大约阅读时间需要 17 分钟。

1.demo效果

2.需要特别配置的地方

3.需要的jar包

4.目录树

5.程序基本架构

6.具体代码

一,demo效果

文件上传:

文件下载:

点击即可下载。

二,需要特别配置的地方

1.负责上传文件的表单和一般表单有区别,负责上传文件的表单的编码类型必需是“multipart/form-data”

2.POJO类要设置代表文件的文件变量,类型为:MultipartFile

3.修改Springmvc的核心配置文件

Springmvc上下文中默认没有装配MultipartResolver,因此默认情况下其不能处理文件上传工作。如果想使用Spring的文件上传功能,则需要在上下文中配置MultipartResolver

(1).配置上传文件大小

(2).配置编码方式

10485760
UTF-8

三,需要的jar包

四,目录树

5.程序基本架构

基于MVC结构:用户的任何请求都会映射到控制器中对应的方法进行处理

六,具体代码

(1)首先,先配置web项目自带的web.xml:主要是用来配置springmvc中的 前端控制器
前端控制器用于根据用户的请求,在控制器中找出相应的方法。(web.xml)
pro4
springmvc
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
/WEB-INF/spring-mvc.xml
1
springmvc
/
(2)spring的核心配置文件:(spring-mvc.xml)
/WEB-INF/
.jsp
10485760
UTF-8
(3)POJO对象,代表文件,用于传输(User.java)
package po;import java.io.Serializable;import org.springframework.web.multipart.MultipartFile;public class User implements Serializable{	private MultipartFile file;	//文件,必需用MultipartFile类型		public MultipartFile getFile() {		return file;	}	public void setFile(MultipartFile file) {		this.file = file;	}}
(4)控制器(FileController.java)
package controller;import java.io.File;import javax.servlet.http.HttpServletRequest;import org.apache.commons.io.FileUtils;import org.springframework.http.HttpHeaders;import org.springframework.http.HttpStatus;import org.springframework.http.MediaType;import org.springframework.http.ResponseEntity;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RequestParam;import po.User;@Controllerpublic class FileController {		/* /upload的映射,且只适用于POST方法*/	@RequestMapping(value="/upload",method=RequestMethod.POST)	//参数里的user 是用来接收传来的文件的	//因为对应上传的文件,类型为MultipartFile,上传文件会自动绑定到 方法参数user里的MultipartFile成员变量	public String upload(HttpServletRequest request,User user,Model model) throws Exception{		if(!user.getFile().isEmpty()){			//path为项目目录下的files目录的路径,(getRealPath()获取绝对路径)			String path = request.getSession().getServletContext().getRealPath("/files/");			//getOriginalFilename()获取上传文件的原名			String filename = user.getFile().getOriginalFilename();			File filepath = new File(path,filename);			if(!filepath.getParentFile().exists()){				filepath.getParentFile().mkdirs();			}			/*transferTo()将上传文件保存到一个目标文件中,separator为目录与目录之间的分隔符,如/a/b/c.txt 中的 \			  将user中的文件保存到目标位置*/			user.getFile().transferTo(new File(path+File.separator+filename));			model.addAttribute("user",user);	//向模型model中加入user作为数据,给页面调用						return "downloadFile";				//返回到下载文件的页面		}		return "error";	}		//处理单一文件下载	@RequestMapping(value="/downloadd")	public ResponseEntity
download(HttpServletRequest request, @RequestParam("filename") String filename,Model model)throws Exception{ //获得要文件所在父目录的绝对路径 String path = request.getSession().getServletContext().getRealPath("/files/"); //获得要下载的文件的对象 File file = new File(path+File.separator+filename); HttpHeaders headers = new HttpHeaders(); //解决中文显示的编码问题,后一个UTF-8是要转编码成的编码,若前后都是一样的(如下),就需要写这句,我下面那句只是演示用 String downloadFileName = new String(filename.getBytes("UTF-8"),"UTF-8"); //通知浏览器以attachment(下载方式)打开文件 headers.setContentDispositionFormData("attachment",downloadFileName); //设置文件的MIME类型 headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); //download方法收到页面传递的文件名filename后,使用FileUpload组件的FileUtils读取项目的files文件夹下的该文件 //并将其构成ResponseEntity对象返回客户端下载 return new ResponseEntity
(FileUtils.readFileToByteArray(file),headers,HttpStatus.CREATED); } /* /upload的映射,且只适用于GET方法*/ @RequestMapping(value="/upload",method=RequestMethod.GET) public String uploadForm(){ return "uploadForm"; }}

(5)文件上传视图(uploadForm.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>
Insert title here

文件上传

请选择文件:

上述的表格是通过POST方式映射到控制器的RequestMapping值为upload 的方法中。

 

(6)文件下载视图(downloadFile.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><%@page import="java.io.File" %>
Insert title here

文件下载

<% String path = request.getSession().getServletContext().getRealPath("/files/"); File file = new File(path); File[] fs = file.listFiles(); for(File f:fs){ if(!f.isDirectory()){ String filename = f.getName(); //取出文件的名字(非绝对路径名) %> <%out.print(filename);%>
<%} }%>
(7)错误页面error.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>
Insert title here

上传失败

你可能感兴趣的文章
MySql中mvcc学习记录
查看>>
mysql中null和空字符串的区别与问题!
查看>>
MySQL中ON DUPLICATE KEY UPDATE的介绍与使用、批量更新、存在即更新不存在则插入
查看>>
MYSQL中TINYINT的取值范围
查看>>
MySQL中UPDATE语句的神奇技巧,让你操作数据库如虎添翼!
查看>>
Mysql中varchar类型数字排序不对踩坑记录
查看>>
MySQL中一条SQL语句到底是如何执行的呢?
查看>>
MySQL中你必须知道的10件事,1.5万字!
查看>>
MySQL中使用IN()查询到底走不走索引?
查看>>
Mysql中使用存储过程插入decimal和时间数据递增的模拟数据
查看>>
MySql中关于geometry类型的数据_空的时候如何插入处理_需用null_空字符串插入会报错_Cannot get geometry object from dat---MySql工作笔记003
查看>>
mysql中出现Incorrect DECIMAL value: '0' for column '' at row -1错误解决方案
查看>>
mysql中出现Unit mysql.service could not be found 的解决方法
查看>>
mysql中出现update-alternatives: 错误: 候选项路径 /etc/mysql/mysql.cnf 不存在 dpkg: 处理软件包 mysql-server-8.0的解决方法(全)
查看>>
Mysql中各类锁的机制图文详细解析(全)
查看>>
MySQL中地理位置数据扩展geometry的使用心得
查看>>
Mysql中存储引擎简介、修改、查询、选择
查看>>
Mysql中存储过程、存储函数、自定义函数、变量、流程控制语句、光标/游标、定义条件和处理程序的使用示例
查看>>
mysql中实现rownum,对结果进行排序
查看>>
mysql中对于数据库的基本操作
查看>>