1.传统的文件上传
文件上传的必要条件:
== 文件上传的原理分析==
借助第三方组件实现文件上传
1.1 导入文件上传的jar包
首先创建一个新项目
index.jsp文件中:
<!--上传文件的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>
提交表单,所有的内容都会封装到request这个对象里边
所以我们要解析request,拿到上传文件的这个选项。
那么怎么拿到request呢?
执行的代码:
public String fileupload1(HttpServletRequest request) throws Exception{
System.out.println("文件上传...");
//使用fileupload组件完成文件上传
//上传的位置 拿某某路径的绝对路径
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()){
//如果是true 说明普通表单向
}else{
//说明上传文件项
//获取上传文件的名称
String filename = item.getName();
//完成文件上传
item.write(new File(path,filename));
//删除临时文件
item.delete();
}
}
return "success";
}
我们选择我们要上传的文件
点击上传!!!
可以再target中找到上传的文件。
但是有时候传的文件名称是一样的,怎么区分呢?
public String fileupload1(HttpServletRequest request) throws Exception{
System.out.println("文件上传...");
//使用fileupload组件完成文件上传
//上传的位置 拿某某路径的绝对路径
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()){
//如果是true 说明普通表单向
}else{
//说明上传文件项
//获取上传文件的名称
String filename = item.getName();
//把文件的名称设置唯一值:uuid
String uuid = UUID.randomUUID().toString().replace("-","");
filename = uuid+"_"+filename;
//完成文件上传
item.write(new File(path,filename));
//删除临时文件
item.delete();
}
}
return "success";
}
再次运行点击:
查看我们选择的图片
2 SpringMVC的文件上传
2.1 SpringMVC的文件上传的原理分析
SpringMVC框架提供了MultipartFile对象,该对象表示上传的文件,要求变量名称必须和表单file标签的name属性名称相同。
首先用户端发送请求,然后上传文件,request到前端控制器。
文件解析器解析request请求,然后拿到上传文件项。
返回一个东西叫upload。(返回上传文件的对象)
然后继续执行那个Controller的方法,解析完了有一个upload对象
通过参数绑定的方式传给上传文件的方法。
那么我们接下来要做的事就是在方法中定义一个参数
SpringMVC提供一个类,表示上传文件的那个对象,只要在方法中定义这么一个类就行了
通过参数绑定的方式,把解析后的文件传给fileupload2这个方法。
那么参数中的upload代表的是upload这个文件项。
接下来我们只要调用upload这个文件项的方法,来最终完成文件的上传
注意:
配置文件解析器:
<!--配置文件解析器-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10485760"/>
</bean>
2.2 SpringMVC的文件上传的代码编写
1 配置文件解析器:
<!--配置文件解析器-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10485760"/>
</bean>
2 请求
3 方法
/**
* SpringMVC文件上传
*/
@RequestMapping("/fileupload2")
public String fileupload2(HttpServletRequest request, MultipartFile upload) throws Exception{
System.out.println("SpringMVC文件上传...");
//使用fileupload组件完成文件上传
//上传的位置 拿某某路径的绝对路径
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";
}
再次运行启动:
3 跨服务器上传和搭建环境
创建一个新的项目
改变端口号
导入jar包:
请求:
方法:
然后再那个项目中手动创建一个uploads的文件夹
运行:
所有代码的文件目录: