本教程源码请访问:tutorial_demo
一、文件上传的前提
form表单的enctype取值必须是:multipart/form-data(默认值:application/x-www-form-urlencode);
method取值必须是post;
提供一个文本选择域<input type="file" />
。
接下来的案例我们借助commons-fileupload组件实现文件上传,需要导入该组件相应的支撑jar包:commons-fileupload和commons-io,我们在pom.xml中添加如下的坐标
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
二、文件上传回顾
2.1、编写上传文件的JSP页面
<%-- 文件上传 --%>
<form action="${pageContext.request.contextPath}/fileUpload" method="post" enctype="multipart/form-data">
文件<input type="file" name="upload" /><br/>
<button type="submit">上传</button>
</form>
2.2、编写控制器类
package org.codeaction.controller;
import org.apache.commons.fileupload.FileItem;
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.util.List;
import java.util.UUID;
@Controller
public class FileUploadController {
//使用fileupload组件完成文件上传
@RequestMapping("/fileUpload")
public String fileUpload(HttpServletRequest request) throws Exception {
System.out.println("文件上传");
//上传的位置
String path = request.getSession().getServletContext().getRealPath("/uploads/");
File file = new File(path);
//判断,该路径是否存在
if (!file.exists()) {
//创建该文件夹
file.mkdirs();
}
//解析request对象,获取上传文件项
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
//解析request
List<FileItem> items = upload.parseRequest(request);
//遍历
for (FileItem item : items) {
//进行判断,当前item对象是否是上传文件项
if (!item.isFormField()) {
//说明上传文件项
//获取上传文件的名称
String fileName = item.getName();
//把文件的名称设置唯一值,uuid
String uuid = UUID.randomUUID().toString().replace("-", "");
fileName = uuid + "_" + fileName;
//完成文件上传
item.write(new File(path + "\", fileName));
//删除临时文件
item.delete();
}
}
return "success";
}
}
三、SpringMVC实现文件上传
3.1、配置文件解析器
在springmvc.xml中添加下面的配置
<!--配置文件解析器对象-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10485760" />
</bean>
3.2、编写上传文件的JSP页面
<%-- SpringMVC文件上传 --%>
<p>SpringMVC方式文件上传</p>
<form action="${pageContext.request.contextPath}/fileUpload1" method="post" enctype="multipart/form-data">
文件<input type="file" name="upload" /><br/>
<button type="submit">上传</button>
</form>
3.3、编写控制器类
在控制器类中添加如下的方法
//SpringMVC实现文件上传
@RequestMapping("/fileUpload1")
public String fileUpload1(HttpServletRequest request, MultipartFile upload) throws IOException {
System.out.println("springmvc文件上传...");
//上传的位置
String path = request.getSession().getServletContext().getRealPath("/uploads/");
//判断,该路径是否存在
File file = new File(path);
if(!file.exists()){
//创建该文件夹
file.mkdirs();
}
//说明上传文件项
//获取上传文件的名称
String filename = upload.getOriginalFilename();
//把文件的名称设置唯一值,uuid
String uuid = UUID.randomUUID().toString().replace("-", "");
filename = uuid+"_"+filename;
//完成文件上传
upload.transferTo(new File(path + "\", filename));
return "success";
}
四、SpringMVC跨服务器文件上传
在实际开发中,我们会有很多处理不同功能的服务器,例如:
- 应用服务器,负责部署我们的应用;
- 数据库服务器,运行我们的数据库;
- 缓存和消息服务器,负责处理大并发访问的缓存和消息;
- 文件服务器,负责存储用户上传文件的服务器。
分服务器处理让服务器各司其职,提升项目的运行效率。
4.1、创建一个图片服务器
- 使用Maven创建一个新的web工程,不需要写任何代码;
- 部署该web工程时,需要修改端口号,不要和上传文件工程的端口号重复,HTTP port:9090,JMX port:1090。
4.2、编写跨服务器文件上传代码
4.2.1、在pom.xml中添加坐标
<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>
这两个Jar包用来实现文件的上传操作。
4.2.2、修改Tomcat配置
修改Tomcat服务器conf下的web.xml,进行如下修改
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<!-- 接受文件的目标服务器可以支持写入操作 -->
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
4.2.3、编写控制器类
在控制器类中添加如下的方法
@RequestMapping("/fileUpload2")
public String fileUpload2(MultipartFile upload) throws Exception {
System.out.println("跨服务器文件上传...");
// 定义上传文件服务器路径
String path = "http://localhost:9090/fileuploadserver/uploads/";
// 说明上传文件项
// 获取上传文件的名称
String filename = upload.getOriginalFilename();
// 把文件的名称设置唯一值,uuid
String uuid = UUID.randomUUID().toString().replace("-", "");
filename = uuid+"_"+filename;
// 创建客户端的对象
Client client = Client.create();
// 和图片服务器进行连接
WebResource webResource = client.resource(path + filename);
// 上传文件
webResource.put(upload.getBytes());
return "success";
}
4.2.4、编写上传文件的JSP页面
<%-- 跨服务器文件上传 --%>
<p>跨服务器方式文件上传</p>
<form action="${pageContext.request.contextPath}/fileUpload2" method="post" enctype="multipart/form-data">
文件<input type="file" name="upload" /><br/>
<button type="submit">上传</button>
</form>
4.2.5、启动项目测试
启动图片服务器之后,一定要在图片服务器发布的目录下新建uploads目录,不然没办法上传。