1 文件上传的必要前提
A form 表单的 enctype 取值必须是:multipart/form-data
(默认值是:application/x-www-form-urlencoded)
enctype:是表单请求正文的类型
B method 属性取值必须是 Post
C 提供一个文件选择域
2 文件上传的原理分析
当 form 表单的 enctype 取值不是默认值后,request.getParameter()将失效。 enctype=”application/x-www-form-urlencoded”时,form 表单的正文内容是:
key=value&key=value&key=value
当 form 表单的 enctype 取值为 Mutilpart/form-data 时,请求正文内容就变成:
每一部分都是 MIME 类型描述的正文
-----------------------------7de1a433602ac 分界符
Content-Disposition: form-data; name=“userName” 协议头
aaa 协议的正文
-----------------------------7de1a433602ac
Content-Disposition: form-data; name=“file”;
filename=“C:\Users\zhy\Desktop\fileupload_demofile\b.txt”
Content-Type: text/plain 协议的类型(MIME 类型)
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-----------------------------7de1a433602ac–
3.编写 jsp 页面_传统
form action="user/testFileUpload" method="post" enctype="multipart/form-data">
选择文件:<input type="file" name="upload"/> <br>
<input type="submit" value="提交"/> <br>
</form>
4.编写控制器_传统
@RequestMapping("/testFileUpload")
public String testFileUpload(HttpServletRequest request) throws Exception {
System.out.println("文件上传testFileUpload.......");
//使用fileupload组件完成文件上传
//上传的位置 获取绝对路径
String realPath = request.getSession().getServletContext().getRealPath("/uploads/");
//判读路径是否存在
File file = new File(realPath);
if (!file.exists()){
//创建文件夹
file.mkdir();
}
System.out.println("文件上传testFileUpload2.......");
//解析request对象,获取上传文件项
DiskFileItemFactory factory =new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
//解析request
List<FileItem> fileItems = upload.parseRequest(request);
//遍历
for(FileItem item:fileItems){
//判断,当前item对象是不是上传文件项
if (item.isFormField()){
//说明是普通表单项
}
//上传文件项
//获取上传文件的名称
String name = item.getName();
//把文件名称设置成唯一值,uuid
String uuid = UUID.randomUUID().toString().replace("-", " ");
name = uuid+"_"+name;
//完成上传
item.write(new File(realPath,name));
//删除临时文件
item.delete();
}
System.out.println("文件上传testFileUpload3.......");
return "successfile";
}
5.编写 jsp 页面_springMVC
<form action="user/testFileUpload2" method="post" enctype="multipart/form-data">
选择文件:<input type="file" name="upload"/> <br>
<input type="submit" value="提交springMVC"/> <br>
</form>
6.编写控制器_springMVC
@RequestMapping("/testFileUpload2")
public String testFileUpload2(HttpServletRequest request, MultipartFile upload) throws Exception {
System.out.println("springMVC方式上传文件.......");
//使用fileupload组件完成文件上传
//上传的位置 获取绝对路径
String realPath = request.getSession().getServletContext().getRealPath("/uploads/");
//判读路径是否存在
File file = new File(realPath);
if (!file.exists()) {
//创建文件夹
file.mkdir();
}
//获取上传文件的名称
String name = upload.getOriginalFilename();
//把文件名称设置成唯一值,uuid
String uuid = UUID.randomUUID().toString().replace("-", " ");
name = uuid + "_" + name;
//完成上传
upload.transferTo(new File(realPath,name));
System.out.println("文件上传testFileUpload3.......");
return "successfile";
}
7.编写控制器_SpringMVC跨服务器方式文件
@RequestMapping("/testFileUpload3")
public String testFileUpload3( MultipartFile upload) throws Exception {
System.out.println("跨服务器文件上传1111.......");
//1.定义上传文件服务器地址
String path="http://localhost:9090/day02_springMVC_02fileupload_war/";
//2.获取上传文件的名称
String name = upload.getOriginalFilename();
//3.把文件名称设置成唯一值,uuid
String uuid = UUID.randomUUID().toString().replace("-", "");
name = uuid + "_" + name;
//创建客户端的对像
Client client = Client.create();
//和图片服务器建立连接
WebResource resource = client.resource(path + name);
//完成上传
resource.put(upload.getBytes());
System.out.println("跨服务器文件上传2222.......");
return "successfile";
}
相关jar包
<!--==============传统文件上传需要的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>
<!--==============SpringMVC跨服务器方式文件上传需要的jar包===========================-->
<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>