简介:

Spring MVC为文件上传提供了直接的支持,这种支持使用即插即用的MultipartResolver实现的。Spring MVC 使用Apache Commons FileUpload技术实现了一个MultipartResolver实现类:CommonsMultipartResolver。因此,Spring MVC的文件上传还需依赖Apache Commons FileUpload的组件。

示例:Spring MVC的文件上传

uploadForm.jsp:

<html>
<head>
<title>文件上传</title>
</head>
<body>
<h2>文件上传</h2>
<form action="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>

负责文件上传的表单的编码类型必须是“multipart/form-data”。

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();
File filePath = new File(path,fileName); //判断路径是否存在,如果不存在就创建一个
if(!filePath.getParentFile().exists()){
filePath.getParentFile().mkdirs();
} //将文件上传保存到一个目标文件中
file.transferTo(new File(path+File.separator+FileName));
return "success";
}else{
return "error";
}
}
 说明:Spring MVC 会将上传文件绑定到MultipartFile对象中,MultipartFile提供了获取上传文件内容、文件名等方法。通过TransferTo()还可以将上传文件存储到硬件中,MultipartFile对象中的常用方法如下:
  • byte[]  getBytes().获取文件数据
  • String  getContentType()。获取文件MIME类型,如image/jpeg等
  • InputStream  getInputStream()。获取文件流
  • String  getName()。获取表单中文件组件的名字
  • String  getOriginalFileName()。获取上传文件的原名
  • Long   getSize()。获取文件的字节大小,单位为byte
  • boolean  isEmpty()。是否有上传的文件
  • void  transferTo(File dest)。将上传文件保存到另一个目标文件中。
★★★:Spring MVC上下文中默认没有装配MultipartResolver,因此默认情况下其不能处理文件上传工作。如果想使用Spring的文件上传功能,则需要在上下文中配置MultipartResolver。
 

springmvc-config.xml:

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--设置上传文件大小-->
<property name="maxUploadSize">
<value>10485760</value>
</property> <!-- 请求编码格式,必须和JSP的pageEncoding属性一致,以便正确读取表单的内容,默认为ISO-8859-1 -->
<property name="defaultEncoding">
<value>UTF-8</value>
</property>
</bean>
 注意:CommonsMultipartResolver必须依赖于Apache commons FileUpload组件,所以需要将Apache的commons FileUpload的jar包放到项目的类路径下
 

示例:使用对象接收上传文件(开发中:上传的文件会作为对象的属性被保存。)

registerForm.jsp:

<html>
<head>
<title>用户注册</title>
</head>
<body>
<h2>用户注册</h2>
<form action="register" enctype="multipart/form-data" method="post">
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>请上传头像:</td>
<td><input type="file" name="image"></td>
</tr>
<tr>
<td><input type="submit" value="注册"></td>
</tr>
</table>
</form>
</body>
</html>

User:

public class User implements Serializable{
private String username; //对应上传的file,类型为MultipartFile,上传文件会自动绑定到image属性当中
private MultipartFile image;
//省略set/get方法
}

FileUploadController:

@RequestMapping(value="/register")
public String register(HttpServletRequest request,
@ModelAttribute User user,
Model model) throws Exception{
System.out.print(user.getUserName); //如果文件不为空,写入上传路径
if(!user.getImage().isEmpty()){
//上传文件路径
String path = request.getServletContext().getRealPath("/images/");
//上传文件名
String fileName = user.getImage().getOriginalFileName();
File filePath = new File(path,fileName);
//判断路径是否存在,如果不存在就创建一个
if(!filePath.getParentFile().exist()){
filePath.getParentFile().mkdirs();
} //将上传文件保存到一个目录文件中
user.getImage().transferTo(new File(path+File.separator+fileName)); //将用户添加到model
model.addAttribute("user",user);
//跳转到下载页面
return "userInfo";
}else{
return "error";
}
}

userInfo.jsp页面:

<h3>文件下载</h3>
<a href="download?fileName=${requestScope.user.image.originalFileName}">
${requestScope.user.image.originalFileName}
</a>

示例:Spring MVC的文件下载

文件下载比较简单,页面一个超链接,href属性等于要下载文件的文件名即可;但如果文件名是中文名,在某些浏览器会导致下载失败;Spring MVC 提供了一个ResponseEntity类型,它可以很方便地定义返回的HttpHeaders和HttpStatus
 

FIleUploadController:

@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 downloadFileName = new String(filename.getBytes("UTF-8"),"iso-8859-1"); //通知浏览器以attachment(下载方式)打开图片
headers.setContentDispositionFormData("attachment",downloadFileName); //application/octet-stream:二进制流数据(最常见的文件下载)
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); //201 HttpStatus.CREATED
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers,HttpStatus.CREATED);
}
说明:download处理方法接收到页面传递的文件名filename后,使用Apache Commons FileUpload组件的FileUtils读取到项目的images文件夹下的该文件,并将其构成ResponseEntity对象返回客户端下载

Spring MVC的文件上传和下载的更多相关文章

  1. Java Web 学习(8) —— Spring MVC 之文件上传与下载

    Spring MVC 之文件上传与下载 上传文件 表单: <form action="upload" enctype="multipart/form-data&qu ...

  2. 0062 Spring MVC的文件上传与下载--MultipartFile--ResponseEntity

    文件上传功能在网页中见的太多了,比如上传照片作为头像.上传Excel文档导入数据等 先写个上传文件的html <!DOCTYPE html> <html> <head&g ...

  3. Spring MVC-学习笔记(5)spring MVC的文件上传、下载、拦截器

    1.文件上传.      spring MVC为文件上传提供了直接的支持,这种支持是即插即用的MultipartResolver(多部分解析器)实现的.spring MVC使用Apache Commo ...

  4. 使用Spring MVC实现文件上传与下载

    前段时间做毕业设计的时候,想要完成一个上传文件的功能,后来,虽然在自己本地搭建了一个ftp服务器,然后使用公司的工具完成了一个文档管理系统:但是还是没有找到自己想要的文件上传与下载的方式. 今天看到一 ...

  5. 基于Spring MVC的文件上传和下载功能的实现

    配置文件中配置扫描包,以便创建各个类的bean对象 <context:component-scan base-package="com.neuedu.spring_mvc"& ...

  6. spring mvc ajaxfileupload文件上传返回json下载问题

    问题:使用spring mvc ajaxfileupload 文件上传在ie8下会提示json下载问题 解决方案如下: 服务器代码: @RequestMapping(value = "/ad ...

  7. Spring MVC的文件上传

    1.文件上传 文件上传是项目开发中常用的功能.为了能上传文件,必须将表单的method设置为POST,并将enctype设置为multipart/form-data.只有在这种情况下,浏览器才会把用户 ...

  8. Spring MVC实现文件上传

    基础准备: Spring MVC为文件上传提供了直接支持,这种支持来自于MultipartResolver.Spring使用Jakarta Commons FileUpload技术实现了一个Multi ...

  9. 【Spring学习笔记-MVC-13】Spring MVC之文件上传

    作者:ssslinppp       1. 摘要 Spring MVC为文件上传提供了最直接的支持,这种支持是通过即插即用的MultipartResolve实现的.Spring使用Jakarta Co ...

随机推荐

  1. Filter中排除对指定URL的过滤

    1. 我们可以在web.xml中配置filter来对指定的URL进行过滤,进行一些特殊操作如权限验证等. <!– session过滤filter –> <filter> < ...

  2. hydra暴力破解ssh服务器密码

    概述 我都没想到,第一次暴力破解服务器密码.竟然是对自己的单位服务器出手..囧,因为还没来得及找测试部要来服务器登录密码,测试部负责人已经下班走了.后来又联系不上,这要更新代码,怎么办..于是就对测试 ...

  3. 【转】W3C中国与百度联合组织移动网页加速技术研讨会

    2017 年 8 月 30 日,W3C 会员百度在北京中关村软件园国际会议中心主办了 "移动网页加速技术研讨会",W3C 中国以及腾讯.阿里巴巴及 UC.搜狗.小米.傲游.中国移动 ...

  4. 斯坦福CS224n课程作业

    斯坦福CS224n作业一 softmax 作业要求如下: 解析:题目要求我们证明\(softmax\)函数具有常数不变性. 解答:对于\(x+c\)的每一维来说,有如下等式成立: \[softmax( ...

  5. Docker 快速开始

    1.  概念 对于开发人员和系统管理员来说,Docker是一个使用容器开发.部署和运行应用程序的平台.使用Linux容器部署应用程序称为容器化.容器并不新鲜,但是将它们用于轻松部署应用程序却很新鲜. ...

  6. 入门系列之Scikit-learn在Python中构建机器学习分类器

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由信姜缘 发表于云+社区专栏 介绍 机器学习是计算机科学.人工智能和统计学的研究领域.机器学习的重点是训练算法以学习模式并根据数据进行预 ...

  7. 粮草先行——Android折叠屏开发技术点(二)

    继该系列的第一篇和番外篇之后,今天我们来聊一聊多窗口开发的注意事项.实际上,与其说"多窗口开发",不如说让我们的APP适应多窗口模式. 可能有朋友会问,为什么要提到多窗口模式呢? ...

  8. wow.js让css3动画变动更有趣(滚动页面动画模拟懒加载特效)

    CSS3的出现给网站页面增加了活力,网站增色不少,有这么小小的一款插件就能做出很多动画效果. 最重要的是它:简单易用.轻量级.无需 jQuery......他就是wow.js 地址:https://d ...

  9. android 自定义权限管理

    在Android6.0后有些权限就需要进行询问,虽然可以将targetSdkVersion设置成小于等于23,但是这样可能有些东西无法使用,所以要进行权限的管理. 实现逻辑:打开页面就询问权限,如果没 ...

  10. Sql Server 复制数据库

    确实很实用 https://www.cnblogs.com/ggll611928/p/7451558.html