Spring MVC下的文件上传和下载

文件上传概述

大多数文件上传都是通过表单形式提交给服务器后台的。当一个表单需要完成上传业务,需要设置如下几项属性。

  • method属性必须为post。即只有post请求,后台才能接受。
  • enctype属性必须为multipart/form-data
  • 文件域的multiple属性设置为multiple则表示多文件上传,默认,单文件上传。
	<form action="uploadUrl" method="post" enctype="multipart/form-data">
		<input type="file" name="filename" multipe="multipe" />
		<input type="submit" value="文件上传"/>
	</form>

文件上传所需JAR包、对象

下载地址:https://archive.apache.org/dist/commons/

  • commons-fileupload-1.3.2.jar
  • commons-io-2.5.jar

当form表单的enctype属性为multipart/form-data时,浏览器会采用二进制的方式来处理表单数据。随之,Spring MVC由MultipartResolver(多部件解析器)对象提供支持。MultipartResolver是一个接口,需要通过它的实现类CommonsMultipartResolver类完成文件上传工作

  1. 配置MultipartResolver接口的Bean
	<bean id="multipartResolver"
		class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<!--上传文件最大长度(字节)-->
		<property name="maxUploadSize" value="xxx"/>
		<!--缓存中最大尺寸-->
		<property name="maxInMemorySize" value="xxx"/>
		<!--编码格式-->
		<property name="defaultEncoding" value="UTF-8"/>
		<!--推迟文件解析-->
		<property name="resolverLazily" value="xxx"/>
	</bean>

CommonsMultipartResolver内部引用"multipartResolver"字符串获取该实现类并完成文件解析的,Bean的id必须为multipartResolver
2. 控制类,处理请求方法

	@Controller
	public class FileUploadController{
		@RequestMapping("/fileUpload")
		public String handleFormUpload(@RequestParam("name") String name,@RequestParam("filename") MultipartFile file,...){
			if(!file.isEmpty()){
				//文件存储
				....
				....
				//返回文件上传成功视图
				return "uploadSuccess";
			}
			//返回文件上传失败视图
				return "uploadFailure";
		}
	}

MultipartFile接口

上传的文件就是被封装在MultipartFile接口中。如下是一些常用方法:

方法说明
byte[] getBytes()以字节形式返回文件的内容
String getCntentType()获取文件的内容类型
InputStream getInputStream()读取文件内容,返回一个InputStream流
String getName()获取表单form的参数名称
String getOriginalFilename()获取上传文件的初始化名
long getSize()获取上传文件的大小,单位字节
boolean isEmpty()上传文件是否为空
void transferTo(File file)将上传文件保存到指定目录下

应用案例——文件上传

  1. 创建项目chapter16,创建相应的包
    在这里插入图片描述
  2. 导入JAR包
    在这里插入图片描述
  3. 配置web.xml
	<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns="http://xmlns.jcp.org/xml/ns/javaee"
     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
     http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" 
     id="WebApp_ID" version="4.0">
	<servlet>
	    <servlet-name>springmvc</servlet-name>
	    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	    <init-param>
	        <param-name>contextConfigLoaction</param-name>
	        <param-value>classpath:springmvc-config.xml</param-value>
	    </init-param>
	    <load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
	    <servlet-name>springmvc</servlet-name>
	    <url-pattern>/</url-pattern>
	</servlet-mapping>
  <display-name>chapter16</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>
  1. 配置springmvc-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.3.xsd">    
	<!-- 扫描所需要的包 -->
	<context:component-scan base-package="com.syl.controller"/>
	<!-- 配置注解驱动 -->
	<mvc:annotation-driven />
	<!-- 定义视图解析器 -->
	<bean id="viewResolver"
	    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<!-- 设置前缀 -->
			<property name="prefix" value="/WEB-INF/jsp/" />
		<!-- 设置后缀 -->
			<property name="suffix" value=".jsp" />
	</bean>
	<!-- 文件上传解析器MultipartResolver -->
	<bean id="multipartResolver"
	    	class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<!-- 请求编码格式 -->
		<property name="defaultEncoding" value="UTF-8"/>
	</bean>
</beans>
  1. 上传界面
    在这里插入图片描述
  2. 控制层,创建处理请求方法
	@Controller
public class FileUploadController {
	/**
	 * 文件上传
	 */
	@RequestMapping("/fileUpload")
	public String handleFormUpload(@RequestParam("name") String name,
				@RequestParam("uploadfile") List<MultipartFile> uploadfile,
				HttpServletRequest request) {
		//判断上传文件是否存在
		if(!uploadfile.isEmpty() && uploadfile.size() > 0) {
			//循环输出上传的文件
			for(MultipartFile file : uploadfile) {
				//获取上传文件的原始名称
				String originalFilename = file.getOriginalFilename();
				//设置上传文件保存目录
				String dirPath = request.getServletContext().getRealPath("/upload/");
				File filePath = new File(dirPath);
				//如果保存路径不存在,则创建目录
				if(!filePath.exists()) {
					filePath.mkdir();
				}
				//使用UUID重新命名上传的文件名称,以防文件名相同,覆盖原文件
				String newFilename = name +"_"+UUID.randomUUID()+"_"+originalFilename;
				try {
					//将文件上传指定目录
					file.transferTo(new File(dirPath+newFilename));
				}catch(Exception e) {
					e.printStackTrace();
					return "error";
				}
			}
			//跳转到文件上传成功页面
			return "success";
		}else {
			return "error";
		}
	}
}
  1. view
    在这里插入图片描述
    在这里插入图片描述

文件下载概述

Spring MVC提供了一个ResponseEntity类型的对象,使用它可以很方便的定义返回的HttpHeaders对象和HttpStatus对象。 通过对这两个对象的设置,即可完成下载文件时所需的配置信息。

应用案例——文件下载

  1. 创建文件下载页面
    在这里插入图片描述
  2. 控制层,处理请求方法
	/*
	 * 	文件下载请求
	 */
	@RequestMapping("/download")
	public ResponseEntity<byte[]> fileDownload(HttpServletRequest request,
									String filename)throws Exception{
		//指定下载的文件路径
		String path = request.getServletContext().getRealPath("/upload/");
		//创建该文件对象
		File file = new File(path+File.separator+filename);
		//设置响应头
		HttpHeaders headers = new HttpHeaders();
		//通知浏览器以下载方式打开文件
		headers.setContentDispositionFormData("attachment", filename);
		//定义以流的形式下载返回文件
		headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
		//使用ResponseEntity对象封装返回下载数据
		return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers,HttpStatus.OK);
	}
  1. view
    在这里插入图片描述

@Syl 2021/08/29 20:51 结尾前两天留

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值