springMVC文件上传和下载功能
文件上传
为了能够将文件上传成功,需要将表单的method属性设置成POST,enctype设置成multipart/form-data,一旦设置为multipart/form-data,浏览器会以二进制处理表单数据,spring默认不能处理文件上传工作,要在springmvc-config.xml配置文件中配置MulipartResolver。
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 上传文件大小上限,单位为字节(10MB) -->
<property name="maxUploadSize">
<value>10485760</value>
</property>
<!-- 请求的编码格式,必须和jSP的pageEncoding属性一致,以便正确读取表单的内容,默认为ISO-8859-1 -->
<property name="defaultEncoding">
<value>UTF-8</value>
</property>
</bean>
配置好MultipartResolver后,实现文件上传的页面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>文件上传</title>
<% String path = request.getContextPath(); %>
</head>
<body>
<h2>文件上传</h2>
<form action="<%=path%>/upload" enctype="multipart/form-data" method="post">
<table>
<tr>
<td>文件描述:</td>
<td><input type="text" name="description"></td>
</tr>
<tr>
<td>请选择文件:</td>
<td><input type="file" name="file"></td>
</tr>
<tr>
<td><input type="submit" value="上传"></td>
</tr>
</table>
</form>
</body>
</html>
创建一个FileUploadController,实现文件的上传功能,主要代码如下:
// 上传文件会自动绑定到MultipartFile中 @RequestMapping(value = "/upload", method = RequestMethod.POST) public String upload(HttpServletRequest request, @RequestParam("description") String description, @RequestParam("file") MultipartFile file) throws Exception { System.out.println(description); // 如果文件不为空,写入上传路径 if (!file.isEmpty()) { // 上传文件路径 String path = request.getServletContext().getRealPath("/images/"); // 上传文件名 String filename = file.getOriginalFilename(); String uuid = UUID.randomUUID().toString(); String name = uuid + filename.substring(filename.lastIndexOf(".")); File filepath = new File(path, name); // 判断路径是否存在,如果不存在就创建一个 if (!filepath.getParentFile().exists()) { filepath.getParentFile().mkdirs(); } // 将上传文件保存到一个目标文件当中 file.transferTo(new File(path + File.separator + name)); // 将文件复制到开发工程路径 File source = new File(path + File.separator + name); File files = new File("D:\\workspace\\FileUpload\\WebContent\\image" + File.separator + name); Files.copy(source.toPath(), files.toPath()); HttpSession session = request.getSession(); session.setAttribute("path", "/image" + File.separator + name); session.setAttribute("name", name); return "success"; } else { return "error"; }
文件下载
以上就实现了文件的上传功能,下面我们来实现文件的下载功能,文件的下载相对比较简单,只需要在页面给出一个链接,将该链接的href属性等于要下载的文件的文件名,就可以实现下载,springmvc提供了一个ResponseEntity类型,使用它可以很方便地定义返回的 HttpHeaders和HttpStatus。
下载页面(success.jsp):
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>文件下载</title> <% String name = (String) request.getSession().getAttribute("name");%> </head> <body> <p>上传成功</p> <h3>文件下载</h3> <a href="download?filename=<%=name%>"> <%=name%> </a> </body> </html>
处理方法接受页面传递的文件名filename后,使用Apache Commons FileUpload组件的FileUtils读取项目的上传文件,并将其构建成ResponseEntity对象返回客户端下载。
@RequestMapping(value = "/download") public ResponseEntity<byte[]> download(HttpServletRequest request, @RequestParam("filename") String filename, Model model) throws Exception { // 下载文件路径 String path = request.getServletContext().getRealPath("/images/"); File file = new File(path + File.separator + filename); HttpHeaders headers = new HttpHeaders(); // 下载显示的文件名,解决中文名称乱码问题 String downloadFielName = new String(filename.getBytes("UTF-8"), "iso-8859-1"); // 通知浏览器以attachment(下载方式)打开图片 headers.setContentDispositionFormData("attachment", downloadFielName); // application/octet-stream : 二进制流数据(最常见的文件下载)。 headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), headers, HttpStatus.CREATED); }
以上就是文件的上传和下载,如有异常欢迎留言交流!
每次更新都是一次成长,努力吧!

浙公网安备 33010602011771号