1.环境设置
1. 1 导入jar包
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
1.2 文化上传的必要前提
1)form表单的enctype取值必须是:multipart/form-data (enctype时表单请求请求正文的类型)
2)mothod必须为post
3)提供一个文件选择域<input type="file" />
我们前面导入的commons-fileupload可以帮我们解析multipart/form-data 形式的表单数据
2.传统方式上传文件
1)网页
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h2>文件上传</h2>
<form action="user/fileupload1" method="post" enctype="multipart/form-data">
选择文件:<input type="file" name = "uplaod"/><br>
<input type="submit" >
</form>
</body>
</html>
2)控制器
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/fileupload1")
public String fileupload1(HttpServletRequest request) throws Exception {
//保存文件路径
String path = request.getSession().getServletContext().getRealPath("/uploads");
File file = new File(path);
//判断是否存在目标路径,没有就生成
if (!file.exists()){
file.mkdir();
}
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
//获取文件
List<FileItem> fileItems = upload.parseRequest(request);
//判断是表单项目还是文件项目
for (FileItem item:fileItems){
if (item.isFormField()){
}else{
String filename = item.getName();
//存放文件
item.write(new File(path,filename));
//删除临时文件
item.delete();
}
}
return "success";
}
}
3.springMVC方式上传文件
springmvc通过控制器拦截网页传过来的请求,并通过文件解析器解析文件。解析完毕后再由控制器向对应处理方法中返回对应文件。
注:前端页面上文件的name必须与后台参数名一致,且前端的enctype和method都是固定的
1)网页
<h2>文件上传1</h2>
<form action="user/fileupload2" method="post" enctype="multipart/form-data">
选择文件:<input type="file" name = "uplaod2"/><br>
<input type="submit" >
</form>
2)配置文件解析器
<!--配置文件解析器-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>
3)处理器方法
@RequestMapping("/fileupload2")
public String fileupload2(HttpServletRequest request,MultipartFile uplaod2) throws Exception {
//保存文件路径
String path = request.getSession().getServletContext().getRealPath("/uploads");
File file = new File(path);
//判断是否存在目标路径,没有就生成
if (!file.exists()){
file.mkdir();
}
uplaod2.transferTo(new File(path,uplaod2.getOriginalFilename()));
return "success";
}
4.跨服务器上传文件
图中表示的是跨服务器存储的一个流程
- 浏览器发起文件上传请求
- 应用服务器接收到文件
- 应用服务器将文件存入文件服务器
- 上传结束
实践操作:
1.首先我们需要部署两个服务器,一个服务器用来存储文件,一个服务器用来处理请求,我这里将文件服务器起名为fileuload,处理请求的服务器名字默认
2.在文件服务器根目录下建立一个uploads文件夹用来存储文件
3.在应用服务器上编写页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h2>文件上传1</h2>
<form action="user/fileupload3" method="post" enctype="multipart/form-data">
选择文件:<input type="file" name = "uplaod2"/><br>
<input type="submit" >
</form>
</body>
</html>
4.这里省略web.xml与springmvc.xml的配置,前面都有
5.编写处理方法
@RequestMapping("/fileupload3")
public String fileupload3(MultipartFile uplaod2) throws Exception {
//保存文件路径
String path = "http://localhost:9090/fileupload2_war_exploded/uploads/";
String filename = uplaod2.getOriginalFilename();
String uuid = UUID.randomUUID().toString().replace("-","");
filename = uuid+filename;
//创建客户端对象
Client client = Client.create();
//和图片服务器进行连接
WebResource webResource = client.resource(path+filename);
//上传文件
webResource.put(uplaod2.getBytes());
return "success";
}