目录


上传文件的表单要求

Spring MVC实现上传文件

需要导入的jar包

配置MultipartResolver解析器

编写接收上传文件的控制器

Spring MVC实现文件下载

下载文件时的header设置

编写文件下载的控制器

Spring MVC配置异常跳转的页面

配置异常页面的介绍

配置ExceptionResolver解析器


上传文件的表单要求

  对于普通表单来说,有几个注意点:

  1、action:表示要提交到哪里;

  2、method:表单提交的方式,常用的有post和get两种,不写的话,默认是get;提交文件是只能使用post方式。

  3、enctype:编码类型,表示提交的数据是什么格式。有三个值,

    1)不显式设置enctype时,默认是application/x-www-form-urlencoded,表示提交的是普通的数据;

    2)text/plain,表示提交的是文本数据,数据量稍大一点。

    3)multipart/form-data,这种方式可以提交二进制数据(音频、图像等文件)

  综上,如果要上传文件,必须要将method设置为post,然后将enctype设置multipart/form-data。另外,上传文件的input标签的type属性设置为file。

<form action="upload" method="post" enctype="multipart/form-data">
<input type="file" name="myfile" />
<input type="submit" name="submit" value="upload" />
</form>

  

Spring MVC实现上传文件

  在看Spring MVC是怎么实现文件上传之前,可以先看一下不是框架,使用原生的servlet开发是怎么实现文件上传的:Servlet 实现文件上传与下载

  在Servlet 3.0之后,Spring MVC实现文件上传主要是使用一个叫MultipartResolver的解析器,该解析器依赖于apache的commons-io和commons-fileupload。MultipartResolver会自动解析文件,之后我们在handlerMethod中,可以很方便的操作上传的文件。

  需要导入的jar包

  必不可少的commons-io.jar和commons-fileupload.jar这两个包,缺一不可。

配置MultipartResolver解析器

  MultipartResolver是一个interface,我们只需要配置他的一个实现类,比如CommonsMultipartResolver这个实现类,配置的方法也很简单,只需要配置一个id为multipartResolver的<bean>即可。

  在Spring MVC的配置文件中增加下面配置:

<!-- 创建MultipartResolver解析器 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 配置属性,可以省略不配置,设置上传的文件maxSize,单位为B(字节) -->
<property name="maxUploadSize" value="1000000"></property>
</bean>

  

  编写接收上传文件的控制器

package cn.ganlixin.controller;

import java.io.File;
import java.io.IOException;
import java.util.UUID; import org.apache.commons.io.FileUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile; @Controller
public class UploadController { @RequestMapping("upload")
// 注意表单中文件input的name要和这里的参数名相同。
public String upload(MultipartFile myfile) throws IOException { // 上传一张图片 C:\Users\Administrator\Desktop\code.png // 获取文件的原始名称
String originalFileName = myfile.getOriginalFilename(); // code.png // 获取上传文件的表单中,input的name值,其实就是myfile(就是接收时的名称)
String fileName = myfile.getName(); // myfile // 获取上传的文件大小,单位为字节
long fileSize = myfile.getSize(); // 5823(字节) String extensionName = originalFileName.substring(originalFileName.lastIndexOf(".")); /*
进行一些过滤判断操作
*/ // 利用apache的commons-io和commons-fileupload,将文件保存到硬盘中,文件名可以根据自己的规则来定,这里使用UUID
String newFileName = UUID.randomUUID().toString();
FileUtils.copyInputStreamToFile(
myfile.getInputStream(),
new File("E:/uploads/" + newFileName + extensionName)
); return "/success.jsp";
}
}

  

Spring MVC实现文件下载

  在原生servlet实现文件下载主要有两步:

  1、使用HttpServletRequest对象接收请求,获取客户端想要下载的文件名;

  2、读取需要下载的文件,然后使用HttpServletResponse对象向客户端输出文件的字节流。

  其实Spring MVC实现文件下载和使用原生servlet实现文件下载的方式并没有太大区别,甚至可以说没有任何区别。唯一的区别就是Spring MVC的控制器没有继承HttpServlet,但是却可以为HandlerMethod注入HttpServletRequest和HttpServletResponse对象,之后就可以进行和原生servlet相同的操作了。

  下载文件时的header设置

  先看一下提供下载文件的资源链接:

<a href="download?fileName=info.txt">点击下载info.txt</a>
<a href="download?fileName=data.rar">点击下载data.rar</a>

  如果仍旧按照以前的设置:Content-Type=text/html; charset=utf-8;    那么当客户端点击下载链接时,发生的事情可能超乎预料。上面这两个资源链接的文件的扩展名,扩展名指明了该文件的格式。如果没有设置文件以附件形式下载,那么对于不同的浏览器,对于文件的处理方式是不同的:

  1、如果浏览器能够打开或者能够解析该类型文件,那么,文件就会直接被浏览器打开(注意,不是下载,不会保存到用户的本地磁盘);

  2、如果浏览器不能打开或者不能解析该类型的文件,那么,浏览器才会将文件下载下来(保存到用户磁盘)。

  比如,当服务器响应info.txt之后,浏览器接收到info.txt,info.txt是文本文件,浏览器可以打开,于是就会将info.txt的内容显示在浏览器的页面中,而没有下载下来。而对于data.rar来说,浏览器无法直接打开,所以会下载到本地。

  为了让用户请求下载的文件都能保存到用户磁盘(即使浏览器能够打开文件,也不要让他打开,而只是让他进行下载),可以设置Content-Disposition属性为attachment(通知浏览器以附件形式下载)。

  编写文件下载的控制器

package cn.ganlixin.controller;

import java.io.File;
import java.io.IOException; import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.commons.io.FileUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody; @Controller
public class DownloadController { @RequestMapping("/download")
// 注入fileName、request、response
public void download(String fileName,
HttpServletRequest request, HttpServletResponse response) throws IOException { // 设置响应是以附件形式,不用设置Content-Type了
response.setHeader("Content-Disposition", "attachment; filename=" + fileName); // 获取文件的真实路径(可供下载的文件都放在/project/WebContext/files/路径下,但是部署到服务器后,files文件夹的路径都会发生改变。
// 所以需要重新获得该文件从根目录开始的路径,然后读取文件,并响应给客户端。
String path = request.getServletContext().getRealPath("files"); // 文件下载时,是使用字节流格式,所以不能使用response.getWriter()-->返回PrintWriter是字符流
// 获取输出字节流恶意使用response.
ServletOutputStream out = response.getOutputStream();
File downloadFile = new File(path, fileName); // 判断文件是否存在
if (! downloadFile.exists()) {
request.setAttribute("msg", "文件不存在");
response.sendError(404);
return;
} // 利用FileUtils将文件读入字节数组,然后返回给客户端。
out.write(FileUtils.readFileToByteArray(downloadFile));
out.flush();
out.close();
}
}

  

Spring MVC配置异常跳转的页面

  配置异常跳转页面的介绍

  我们的服务器在运行过程中可能会出现各种异常,当出现异常的时候,根据Java的脾气,一定会打印堆栈信息,这个信息不能直接暴露给用户,一个原因是打印的堆栈信息并不是用户关心的内容,会影响用户体验;另一方面,如果被黑客获取到堆栈信息,也是一种安全隐患。

  所以我们在编程过程中,使用了很多try{   } catch{  },每当出现异常XxxException,可以根据异常的类型,返回给客户一个特定的异常页面。这个返回异常的部分如果直接写在业务代码中也是可以的,但是却不是推荐的。

  Spring MVC提供了一个ExceptionResolver解析器,这个解析器可以为我们做这么一个事情:根据我们自定义的配置,当出现某种Exception的时候,就直接跳转到指定的页面,不需要在逻辑代码中进行处理。

  举个例子:当服务端接收客户端上传的文件时,发现文件的大小超过了设置的最大值,此时,如果配置MultipartResolver时设置了上传文件的最大值,那么此时就会出现org.springframework.web.multipart.MaxUploadSizeExceededException,出现异常时,异常堆栈信息也会显示给客户端,此时就可以配置下ExceptionResolver,当出现这个错误,就跳转到uploadFailed.jsp中。

  配置ExceptionResolver解析器

  配置ExceptionResolver解析器的方式也很简单,只需要配置一个id为exceptionResolver的<bean>即可,class可以是ExceptionResolver的一个实现实现类。

<!-- 配置ExceptionResolver解析器 -->
<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!-- 配置异常与跳转页面的对应关系 -->
<property name="exceptionMappings">
<props>
<prop key="org.springframework.web.multipart.MaxUploadSizeExceededException">/uploadFailed.jsp</prop>
</props>
</property>
</bean>

  

SpringMVC 实现文件上传与下载,并配置异常页面的更多相关文章

  1. 使用springMVC实现文件上传和下载之环境配置与上传

    最近的项目中用到了文件的上传和下载功能,任务分配给了其他的同时完成.如今项目结束告一段落,我觉着这个功能比较重要,因此特意把它提取出来自己进行了尝试. 一. 基础配置: maven导包及配置pom.x ...

  2. springMvc之文件上传与下载

    我们经常会使用的一个功能是文件下载,既然有文件下载就会有文件上传,下面我们来看一下文件上传是如何实现的 首先准备好一个页面 <style type="text/css"> ...

  3. springmvc之文件上传、下载

    1.接收到的是图片的流时 //上传头像 @RequestMapping(value = "/uploadHeadSculpture", method = RequestMethod ...

  4. SpringMVC的文件上传与下载

    1. 单文件上传 配置jsp页面 <%@ page contentType="text/html;charset=UTF-8" language="java&quo ...

  5. 使用SpringMVC实现文件上传和下载

    文件上传 第一步,加入jar包: commons-fileupload-1.3.1.jar commons-io-2.4.jar 第二步,在SpringMVC配置文件中配置CommonsMultipa ...

  6. 使用springMVC实现文件上传和下载之文件下载

    接上一篇,文件下载需要获取下载文件的存储路径,这里只是手动填入,如果是在具体项目中,可以把文件名和上传后的存储路径保存在数据库中.然后增加一个文件列表的页面展示文件名和文件路径,然后点击下载的时候把相 ...

  7. 文件上传和下载(可批量上传)——Spring(二)

    针对SpringMVC的文件上传和下载.下载用之前“文件上传和下载——基础(一)”的依然可以,但是上传功能要修改,这是因为springMVC 都为我们封装好成自己的文件对象了,转换的过程就在我们所配置 ...

  8. 一起学SpringMVC之文件上传

    概述 在Web系统开发过程中,文件上传是普遍的功能,本文主要以一个简单的小例子,讲解SpringMVC中文件上传的使用方法,仅供学习分享使用,如有不足之处,还请指正. 文件上传依赖包 如下所示,文件上 ...

  9. SpringMVC文件上传与下载

    一.关键步骤 ①引入核心JAR文件 SpringMVC实现文件上传,需要再添加两个jar包.一个是文件上传的jar包,一个是其所依赖的IO包.这两个jar包,均在Spring支持库的org.apach ...

随机推荐

  1. Criteria查询初学者的采纳点哦

    一.Hibernate提供了5种检索对象的方式 1.导航对象图检索方式:根据已经加载的对象导航到其他对象    from  Emp e group by e.dept.deptName 2.OID检索 ...

  2. GNU C 内联汇编介绍

    GNU C 内联汇编介绍 简介 1.很早之前就听说 C 语言能够直接内嵌汇编指令.但是之前始终没有去详细了解过.最近由于某种需求,看到了相关的 C 语言代码.也就自然去简单的学习了一下如何在 C 代码 ...

  3. android的ArrayMap类

    运行的时候出现: java.lang.NoClassDefFoundError: android.util.ArrayMap http://stackoverflow.com/questions/24 ...

  4. Ubuntu 14.04 LTS 下 android 2.3.5 源码编译过程

    Ubuntu 14.04 LTS 下 android 2.3.5 源码编译过程   在新的Ubuntu 64位系统下去编译早期的安卓源码是会出现很多问题的,因为64位系统在安装完成后,很多32位的兼容 ...

  5. HAProxy 的负载均衡服务器,Redis 的缓存服务器

    问答社区网络 StackExchange 由 100 多个网站构成,其中包括了 Alexa 排名第 54 的 StackOverflow.StackExchang 有 400 万用户,每月 5.6 亿 ...

  6. 微信内置浏览器的JsAPI(WeixinJSBridge续)_Alien的笔记

    微信内置浏览器的JsAPI(WeixinJSBridge续)_Alien的笔记 微信内置浏览器的JsAPI(WeixinJSBridge续)进入全屏 之前有写过几篇关于微信内置浏览器(WebView) ...

  7. linuxmint计算器

    命令行输入bc进入计算器, 可以计算 + 加法 - 减法* 乘法 / 除法^ 指数 % 余数 quit   关闭计算器

  8. 关于springboot启动的问题.

    IDE使用的是IDEA: 遇到的问题:使用springboot自带main方法无法启动示例,解决方案: 如果大家使用Application中的main方法无法正常启动时,可以去修改Project St ...

  9. cocos JS for循环让精灵从屏幕中间往两边排列散开

    //this.ShowImg[i] 需要排列什么就push加进数组里面,一个for循环计算即可 var size = this.ShowImg.length;var count = size; for ...

  10. crontab详细用法

    使用crontab你可以在指定的时间执行一个shell脚本或者一系列Linux命令.例如系统管理员安排一个备份任务使其每天都运行 如何往 cron 中添加一个作业? # crontab –e0 5 * ...