文件上传
首先要导包
<!--文件上传和下载的包commons-fileupload,依赖于commons-io-->
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
然后配置文件上传的配置,需要在SpringMVC的配置文件中配置CommonsMultipartResolver类
上传文件解析器——MultipartResolver
SpringMVC中没有默认装配MultipartResolver,因此在默认情况下不饿能处理文件上传工作,所以必须配置MultipartResolver
MultipartResolver 用于处理文件上传,当收到请求时 DispatcherServlet 的 checkMultipart() 方法会调用 MultipartResolver 的 isMultipart() 方法判断请求中是否包含文件。如果请求数据中包含文件,则调用 MultipartResolver 的 resolveMultipart() 方法对请求的数据进行解析,然后将文件数据解析成 MultipartFile 并封装在 MultipartHttpServletRequest (继承了 HttpServletRequest) 对象中,最后传递给 Controller
<!--文件上传或下载-->
<!--bean的id必须为multipartResolver,否则400;-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8"/>
<!--maxUploadSize以字节为单位 ,1,048,576为1M 我们这里设置上传大小限制10M-->
<property name="maxUploadSize" value="10485760"/>
<!--缓存大小-->
<property name="maxInMemorySize" value="40960"/>
</bean>
开始写代码
controller
- 必须注意:@RequestParam(“file”)接收文件
- 接收的文件的类型为CommonsMultipartFile , 这是SpringMVC封装的
package com.anye.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
@Controller
public class FileUploadController {
@RequestMapping("/upload")
@ResponseBody
public String upload(@RequestParam("file") CommonsMultipartFile file,
HttpServletRequest request) throws IOException {
//1、获取文件名
String filename = file.getOriginalFilename();
if("".equals(filename)){
return "文件不存在";
}
//2、上传文件保存路径
String path = request.getServletContext().getRealPath("/upload");
File realPath = new File(path);
if(!realPath.exists()){
realPath.mkdir();
}
//3、上传文件
InputStream is = file.getInputStream();
FileOutputStream os = new FileOutputStream(new File(realPath, filename));
int len = 0;
byte[] buffer = new byte[1024];
while ((len=is.read(buffer))!=-1){
os.write(buffer,0,len);
os.flush();
}
//4、关闭流
os.close();
is.close();
return "上传完毕";
}
}
前端
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--enctype="multipart/form-data"才能支持文件上传,这个表示使用二进制流的形式处理表单数据
application/x-www-form-urlencoded 是enctype的默认值。只处理表单中value属性的值;
enctype="text/plain" : 表示他只会将空格转换为 + 号, 其他东西不变,使用表单邮件发送
--%>
<form action="${pageContext.request.contextPath}/upload" method="post" enctype="multipart/form-data">
<%--name服务器可以取这个文件的值--%>
<input type="file" name="file">
<input type="submit" value="upload">
</form>
</body>
</html>
spring-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:component-scan base-package="com.anye.controller"/>
<mvc:default-servlet-handler/>
<mvc:annotation-driven>
<!--JSON格式乱码处理方式-->
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8"/>
</bean>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
<property name="failOnEmptyBeans" value="false"/>
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<!--视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!--文件上传或下载-->
<!--bean的id必须为multipartResolver,否则400;-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8"/>
<!--maxUploadSize以字节为单位 ,1,048,576为1M 我们这里设置上传大小限制10M-->
<property name="maxUploadSize" value="10485760"/>
<!--缓存大小-->
<property name="maxInMemorySize" value="40960"/>
</bean>
</beans>
测试:
还有一种方法,只需要修改controller
package com.anye.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
@Controller
public class FileUploadController {
@RequestMapping(value = "/upload",produces = "application/json;charset = utf-8")
@ResponseBody
public String upload2(@RequestParam("file") CommonsMultipartFile file,
HttpServletRequest request) throws IOException {
String path = request.getServletContext().getRealPath("/upload");
File file1 = new File(path);
if (!file1.exists()){
file1.mkdir();
}
file.transferTo(new File(file1+"/"+file.getOriginalFilename()));
return "上传完毕";
}
}
文件下载
controller
package com.anye.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;
@Controller
public class FileDownloadController {
@RequestMapping(value = "/download",produces = "application/json;charset = utf-8")
@ResponseBody
public String download(HttpServletResponse response) throws IOException {
//要下载的文件地址
String path = "C:/Users/1/Desktop";
String fileName = "001.jpg";
File file = new File(path, fileName);
//设置响应头的信息
response.reset();//让页面不缓存
response.setCharacterEncoding("utf-8");
//二进制流传输数据
response.setContentType("multipart/form-data");
response.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(fileName,"UTF-8"));
FileInputStream is = new FileInputStream(file);
ServletOutputStream os = response.getOutputStream();
int len = 0;
byte[] buffer = new byte[1024];
while ((len = is.read(buffer)) != -1){
os.write(buffer,0,len);
os.flush();
}
os.close();
is.close();
return null;
}
}
前端
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<p><a href="${pageContext.request.contextPath}/download">下载图片</a></p>
</body>
</html>
测试