关于文件上传
1.必须使用表单
2.请求必须是POST
3.enctype="multipart/form-data"
注:enctype="multipart/form-data" 注意虽然我们SpringMVC模拟了PUT,那么如果要做上传操作,那么一定使用POST请求
上传的方式,一共两种方式
1.commons-fileupload-jar、commons-io.jar
2.Servlet3.0上默认提供上传操作:可以自学一下
上传操作的步骤
1.首先判断该请求是否为上传请求
2.获取上传的服务端的绝对路径
3.判断上传目录是否存在,如果不存在则创建
4.构建磁盘工程
5.创建ServletUpload的类
6.解析请求
7.遍历List<FileItem>
8.判断表单中是普通控件还是上传的文件
如果是上传文件
10.获取上传文件的名称
11.获取上传文件的后缀名
12.创建输入输出流
13.传统方式适应流的操作
14.关闭资源
SpringMVC的上传操作的配置
<!-- 关于上传文件的配置,id尽量就叫该名不然有错误 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置上传的编码格式为UTF-8 -->
<property name="defaultEncoding" value="UTF-8"/>
<!-- 允许上传的最大文件为10M -->
<property name="maxUploadSize" value="10485760"/>
<!-- 设置临时文件夹 -->
<property name="uploadTempDir"value="temp"/>
<!-- 设置缓存 -->
<property name="maxInMemorySize" value="2048"/>
</bean>
模拟环境,用户的添加功能,中间包含头像的信息
A.新建表单和上传获取属性测试
<h2>用户添加</h2>
<form action="add" method="post" enctype="multipart/form-data">
<input type="text" name="account" placeholder="账号"><br/>
<input type="text" name="password" readonly="readonly" value="123456"><br/>
<input type="text" name="user_name" placeholder="姓名"><br/>
<input type="file" name="myFile">
<input type="submit" value="用户添加操作">
</form>
@RequestMapping(value="/add",method=RequestMethod.POST)
public ModelAndView add(Useruser
,@RequestParam(name="myFile")MultipartFilefile){
System.out.println(user);
System.out.println(file.getContentType());//文件类型
System.out.println(file.getName());//表单文件域 name="myFile"
System.out.println(file.getOriginalFilename());//获取上传文件的名称
System.out.println(file.getSize());//获取文件的大小
return null;
}
说明: 1.需要保存到数据库的信息为上传文件的名称,所有在持久化类里面我们定义的是字符串 |
使用输入输出流的方式,完成上传操作
if(!file.isEmpty()){//1.判断文件是否存在
//2.获取服务端的绝对路径
String path =this.session.getServletContext().getRealPath("/upload");
System.out.println("服务器项目的绝对路径-->"+path);
//3.判断该文件夹是否存在,不存在则创建
File folder =new File(path);
if(!folder.isDirectory()){//在文件存在的情况下,才判断是否为文件夹,如果不存在返回的都是false
folder.mkdirs();//创建文件
}
//4.取得上传文件的名称
String fileName =file.getOriginalFilename();
//5.获取上传文件的后缀名
String ext = FilenameUtils.getExtension(fileName);
//6.创建新的文件名称 user.setPhoto(newFileName)应该保存该名称,存到数据库当中
String newFileName = UUID.randomUUID().toString()+"."+ext;//保证上传文件名称不重复
//7.建立输入输出流
InputStream is =null;
OutputStream os =null;
try {
//8.获取输入流
is = file.getInputStream();
//9.创建文件的输出流
os = new FileOutputStream(path+"/"+newFileName);
//10.输出过程
byte[]b =new byte[1024];//设置读取的字节缓存
int length = -1;
while((length=is.read(b))!=-1){//is.read(b)当读不到数据的时候,返回值为 -1
os.write(b, 0,length);
}
} catch (Exceptione) {
e.printStackTrace();
}finally {
//11.关闭资源
if(is!=null)is.close();
if(os!=null){
os.flush();
os.close();
}
}
SpringMVC内置方法上传
//1.判断该文件是否存在
if(!file.isEmpty()){
//2.获取服务端的绝对路径
String path =this.session.getServletContext().getRealPath("/upload");
//3.判断该文件夹是否存在,不存在则创建
File folder =new File(path);
if(!folder.isDirectory()){//在文件存在的情况下,才判断是否为文件夹,如果不存在返回的都是false
folder.mkdirs();
}
//4.取得上传文件的名称
String fileName =file.getOriginalFilename();
//5.获取上传文件的后缀名
String ext = FilenameUtils.getExtension(fileName);
//7.创建新的文件名称 有两种方式
//String newFileName = UUID.randomUUID().toString()+"."+ext;
String newFileName = (new Date()).getTime()+"_"+(new Random()).nextInt(10000)+"."+ext;
//8.创建文件
File newFile =new File(path+"/"+newFileName);
//9.上传操作
try {//file形参中的那个文件 newFile自己重新创建的文件
file.transferTo(newFile);
} catch (Exceptione) {
e.printStackTrace();
}
//10.保存新的文件名称
user.setPhoto(newFileName);
}
System.out.println(user);//余下操作为传递USER对象,到Mapper中执行SQL语句
return null;
多文件上传:简单介绍一下
<h2>多文件上传</h2>
<form action="more1" method="post"
enctype="multipart/form-data">
<input type="file" name="myFile">
<input type="file" name="myFile">
<input type="file" name="myFile">
<input type="submit" value="多文件上传">
</form>
使用数组接收数据
@RequestMapping(value ="/more1", method = RequestMethod.POST)
public ModelAndView add(MultipartFile[] myFile) {
return null;
}
使用jquery插件完成Ajax文件上传操作
表单:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML>
<html>
<head>
<base href="<%=basePath%>">
<meta charset="UTF-8">
<!-- 引入JQuery库 -->
<script type="text/javascript" src="resource/jquery.js"></script>
<!-- 引入Ajax上传插件 -->
<script type="text/javascript" src="resource/jquery.ajaxfileupload.js"></script>
<script type="text/javascript">
$(function(){
$('input[name="myFile"]').ajaxfileupload({//绑定Ajax文件上传事件
'action':'ajaxUpload',//设置访问路径
'onComplete':function(data) {//data为接收服务端返回的文件名称的值
alert(data);
}
});
})
</script>
</head>
<body>
<h2>Ajax上传</h2>
<input type="file" name="myFile">
</body>
</html>
@RequestMapping(value ="/ajaxUpload", method = RequestMethod.POST)
public ModelAndView add(MultipartFilemyFile)throws IOException {
// 1.判断该文件是否存在
if (!myFile.isEmpty()) {
// 2.获取服务端的绝对路径
String path =this.session.getServletContext().getRealPath("/upload");
System.out.println("服务器项目的绝对路径-->" +path);
// 3.判断该文件夹是否存在,不存在则创建
File folder =new File(path);
if (!folder.isDirectory()) {//在文件存在的情况下,才判断是否为文件夹,如果不存在返回的都是false
folder.mkdirs();
}
// 4.取得上传文件的名称
String fileName =myFile.getOriginalFilename();
// 5.获取上传文件的后缀名
String ext = FilenameUtils.getExtension(fileName);
// 7.创建新的文件名称
// String newFileName = UUID.randomUUID().toString()+"."+ext;
String newFileName = (new Date()).getTime() +"_" + (new Random()).nextInt(10000) +"." +ext;
// 8.创建文件
File newFile =new File(path +"/" +newFileName);
// 9.上传操作
try {
myFile.transferTo(newFile);
} catch (Exceptione) {
e.printStackTrace();
}
this.response.setContentType("text/html;charset=UTF-8");
PrintWriter out =this.response.getWriter();
out.write(newFileName);
out.flush();
out.close();
}
return null;
}