1. 传统方式
前提
A form表单的 enctype取值必须是:multipart/form-data
(默认值是:application/x-www-form-urlencoded)
enctype:是表单请求正文的类型
B method 属性取值必须是 Post
C 提供一个文件选择域<inputtype=”file” />
pom依赖
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency>
jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/springmvc/fileupload1"method="post" enctype="multipart/form-data">
名称:<input type="text"name="picname"/><br/>
图片:<input type="file"name="uploadFile"/><br/>
<input type="submit"value="上传"/>
</form>
</body>
</html>
controler
package lz.fileupload; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileItemFactory; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import javax.servlet.http.HttpServletRequest; import java.io.File; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import java.util.UUID; /** * @author 黑马程序员 * @Company http://www.ithiema.com */ @Controller @RequestMapping("springmvc") public class FileUploadTestController1 { /** * 文件上传 * @param request */ @RequestMapping("fileupload1") public void testFileUpload(HttpServletRequest request)throws Exception{ //1.找到上传文件的位置,需要使用ServletContext对象的getRealPath() String basePath = request.getSession().getServletContext().getRealPath("/uploads"); System.out.println(basePath); //2.通过日期创建一个二级目录 /uploads/2018-06-19/ String datePath = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); //3.判断目录是否存在,不存在就创建 File file = new File(basePath,datePath); if(!file.exists()){ file.mkdirs(); } //4.创建文件项工厂对象 FileItemFactory factory = new DiskFileItemFactory(); //5.创建上传文件的核心对象 ServletFileUpload upload = new ServletFileUpload(factory); //6.解析request,得到表单项的集合 List<FileItem> items = upload.parseRequest(request); //7.遍历集合,取出每一项判断是不是文件 for(FileItem item : items){ //判断 if(item.isFormField()){ //true的时候是普通字段,非文件 }else{ //取出文件名 String fileName = item.getName(); //为了防止文件重名,我们需要随机化文件名 String uuid = UUID.randomUUID().toString().replace("-","").toUpperCase(); //设置随机文件名 fileName = uuid+"_"+fileName; //向服务器写文件 item.write(new File(file,fileName)); //清除临时文件 item.delete(); } } } }
如果选择war:explode会发布在项目target下,tomcat引用,
选择war则会在项目中打一个war包,复制一份到tomcat,webapp中
2. springmvc 传统方式的文件上传
传统方式的文件上传,指的是我们上传的文件和访问的应用存在于同一台服务器上。
并且上传完成之后,浏览器可能跳转。
第一步:创建maven工程并导入commons-fileupload坐标
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
第二步:编写jsp页面
springmvc的MuiltpartFile的使用 <form action="${pageContext.request.contextPath}/springmvc/fileupload2" method="post" enctype="multipart/form-data"> <input type="file" name="uploadFile" ><br/> <input type="submit" value="上传"> </form>
第三步:编写控制器
package lz.fileupload; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import java.io.File; import java.text.SimpleDateFormat; import java.util.Date; import java.util.UUID; /** * @author 黑马程序员 * @Company http://www.ithiema.com */ @Controller @RequestMapping("springmvc") public class FileUploadTestController2 { /** * 文件上传 * 使用springmvc提供的MultipartFile对象实现 * 该对象是作为控制器方法的形参来使用的,形参的变量名称必须和表单type=file的字段名称保存一致 * @param request */ @RequestMapping("fileupload2") public void testFileUpload(HttpServletRequest request, MultipartFile uploadFile)throws Exception{ //1.找到上传文件的位置,需要使用ServletContext对象的getRealPath() String basePath = request.getSession().getServletContext().getRealPath("/uploads"); //2.通过日期创建一个二级目录 /uploads/2018-06-19/ String datePath = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); //3.判断目录是否存在,不存在就创建 File file = new File(basePath,datePath); if(!file.exists()){ file.mkdirs(); } //4.取出文件名 String fileName = uploadFile.getOriginalFilename(); //为了防止文件重名,我们需要随机化文件名 String uuid = UUID.randomUUID().toString().replace("-","").toUpperCase(); //设置随机文件名 fileName = uuid+"_"+fileName; //写文件 uploadFile.transferTo(new File(file,fileName)); } }
第四步:配置文件解析器
<!-- 配置文件上传解析器 -->
<beanid="multipartResolver" <!--id的值是固定的-->
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置上传文件的最大尺寸为 5MB -->
<property name="maxUploadSize">
<value>5242880</value>
</property>
</bean>
注意:
文件上传的解析器 id是固定的,不能起别的名称,否则无法实现请求参数的绑定。(不光是文件,其他
字段也将无法绑定)
3. 跨服务器文件上传
springmvc 跨服务器方式的文件上传
5.3.1 分服务器的目的
在实际开发中,我们会有很多处理不同功能的服务器。例如:
应用服务器:负责部署我们的应用
数据库服务器:运行我们的数据库
缓存和消息服务器:负责处理大并发访问的缓存和消息
文件服务器:负责存储用户上传文件的服务器。
(注意:此处说的不是服务器集群)
分服务器处理的目的是让服务器各司其职,从而提高我们项目的运行效率。
5.3.2 准备两个tomcat服务器,并创建一个用于存放图片的web工程
在文件服务器的 tomcat配置中加入,允许读写操作。文件位置:
5.3.3 导入 jersey的坐标
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
<version>1.18.1</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.18.1</version>
</dependency>
5.3.4 编写控制器实现上传图片
/**
* 响应json数据的控制器
**/
@Controller("fileUploadController2")
public class FileUploadController2 {
public static final String FILESERVERURL =
"http://localhost:9090/day06_spring_image/uploads/";
/**
* 文件上传,保存文件到不同服务器
*/
@RequestMapping("/fileUpload2")
public StringtestResponseJson(String picname,MultipartFile uploadFile) throws
Exception{
//定义文件名
String fileName = "";
//1.获取原始文件名
String uploadFileName = uploadFile.getOriginalFilename();
//2.截取文件扩展名
String extendName =
uploadFileName.substring(uploadFileName.lastIndexOf(".")+1,
uploadFileName.length());
//3.把文件加上随机数,防止文件重复
String uuid =UUID.randomUUID().toString().replace("-", "").toUpperCase();
//4.判断是否输入了文件名
if(!StringUtils.isEmpty(picname)) {
fileName = uuid+"_"+picname+"."+extendName;
}else {
fileName = uuid+"_"+uploadFileName;
}
System.out.println(fileName);
//5.创建 sun公司提供的 jersey包中的 Client 对象
Client client = Client.create();
//6.指定上传文件的地址,该地址是web路径
WebResource resource = client.resource(FILESERVERURL+fileName);
//7.实现上传
String result = resource.put(String.class,uploadFile.getBytes());
System.out.println(result);
return "success"; 传智播客——专注于 Java、.Net 和 Php、网页平面设计工程师的培训
北京市昌平区建材城西路金燕龙办公楼一层 电话:400-618-9090
}
}
5.3.5 编写 jsp页面
<form action="fileUpload2"method="post" enctype="multipart/form-data">
名称:<inputtype="text" name="picname"/><br/>
图片:<inputtype="file" name="uploadFile"/><br/>
<input type="submit" value="上传"/>
</form>
5.3.6 配置解析器
<!-- 配置文件上传解析器 -->
<beanid="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置上传文件的最大尺寸为 5MB -->
<property name="maxUploadSize">
<value>5242880</value>
</property>
</bean>
注意:此处 bean的id取值是固定的。