传统得文件上传
引入jar包
我创建得时maven项目 所以引入坐标即可
<dependency> <!-- 文件上传得工具 -->
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
前端准备 (注意事项)
<!--文件上传 前端要求 请求方式为POST enctype="multipart/form-data"
<input type="file" multiple> multiple 为同时上传多个文件
-->
<form action="${pageContext.request.contextPath}/upload/upload01" enctype="multipart/form-data" method="post">
name: <input type="text" name="name" value="tom"><br/>
file: <input type="file" name="fileUpload" ><br/>
<input type="submit" value="确定上传文件">
</form>
后端 java 控制器 (我这里得路径请求是对应得)
★★★★★★★★★ 因为前台 使用得en 所以我们传统得request 失效了
package com.itheima.web.uploadController;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
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.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.UUID;
//使用upload 组件完成上传
@Controller("uploadController01")
@RequestMapping("/upload")
public class uploadController01 {
@RequestMapping("/upload01") //要使用上传 需要jar包
public String upload(HttpServletRequest request) throws Exception { //我们需要获取前台 传入得请求对象 获取请求信息
//★★★★★★★★★ 因为前台 使用得en 所以我们传统得request 失效了
// 创建一个存放文件下载得根目录 在target下 (其中为了方便区分查找文件 我们定义了日期分类)
String realPath = request.getServletContext().getRealPath("/upload");
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
String format = simpleDateFormat.format(new Date());
File directory = new File(realPath,format); //在upload目录下创建 当前日期文件夹(yyyy-MM-dd)
// System.out.println(realPath); //E:/06框架/test/springmvc02/target/springmvc02/upload
if(!directory.exists()){ //如果没有就创建
directory.mkdirs();//创建目录
}
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory(); //获取工厂默认值
//用来解析 request 对象得
ServletFileUpload uploadr = new ServletFileUpload(diskFileItemFactory);//获取解析器
//解析请求对象 uploadr.parseRequest(request) 返回list' fileItem 有异常我们先不管 抛出
List<FileItem> fileItems = uploadr.parseRequest(request);
System.out.println(fileItems);
获取上传文件得信息 区分类型 是文件得我们进行处理
// 解析得对象也是数据 需要遍历 假设是文件 获取文件得后缀名 不确定上传多少 我们使用遍历进行操作
for (FileItem item : fileItems) {
if (item.isFormField()) { //普通字段 我们模拟 就先打印一下看看
//如果传入中文 之前配置中文乱码 是不管用得
System.out.println("isFormField()------" + item.isFormField());
System.out.println("getFieldName()------" + item.getFieldName());
System.out.println("getString()------" + item.getString("UTF-8"));//指定编码 之前得request.set 无效
} else { //上传字段 是文件 就完成上传
//获取文件名:
String filename = item.getName();//得到文件名 1.jpg 或者 c:/destop/1.jpg
//放置目录下得文件名称一致后 被替换 我们要给 自定文件 命名时不能重复
//获取文件后缀名,并以UUID作为主文件名进行存放: UUID文件名.jpg
String extendName = filename.substring(filename.lastIndexOf("."));// .jpg
//UUID 转化字符串后 格式为 xxx - xxx- xxx- 我们把- 去掉
String uuidFileName = UUID.randomUUID().toString().replace("-","").toUpperCase()+extendName;//SDLKJFLKSDFJL.jpg
File target = new File(directory,uuidFileName);
item.write(target);//把上传的文件写入到指定的文件夹中。
item.delete();//清除缓存
}
}
return "success";
}
}