2.代码实现代码实现-文件上传
请创建 templates/upload.html,确保头像只能选择一个,而宠物可上传多个图片
<!doctype html><html lang="en" xmlns:th="http://www.thymeleaf.org"><head> <meta charset="utf-8"> <title>upload</title></head><body bgcolor="#ced3fe"><img src="images/1.gif"/><hr/><div > <h2>注册用户~</h2> <form action="#" th:action="@{/upload}" method="post" enctype="multipart/form-data"> 用户名:<input type="text" name="name"/><br/><br/> 电 邮:<input type="text" name="email"/><br/><br/> 年 龄:<input type="text" name="age"/><br/><br/> 职 位:<input type="text" name="job"/><br/><br/> 头 像:<input type="file" name="header"><br/><br/> 宠 物:<input type="file" name="photos" multiple><br/><br/> <input type="submit" value="注册"/> <input type="reset" value="重新填写"/> </form></div><hr/></body></html>
2.创建src\main\java\com\llp\springboot\controller\uploadcontroller.java
@slf4j@controllerpublic class uploadcontroller { //处理转发到用户注册-可以完成文件上传页面 @getmapping("/upload.html") public string uploadpage() { return "upload";// 视图解析,转发到templates/upload.html } @postmapping("/upload") @responsebody public string upload(@requestparam("name") string name, @requestparam("email") string email, @requestparam("age") integer age, @requestparam("job") string job, @requestparam("header") multipartfile header, @requestparam("photos") multipartfile[] photos) throws ioexception { log.info("name:{},email:{},age:{},job:{},header.size:{},photos.length:{}",name,email,age,job,header.getsize(),photos.length); //1.获取源文件名称 string originalfilename = header.getoriginalfilename(); // /e:/ideaprojects/springboot-sysuser/target/classes/ string path = resourceutils.geturl("classpath:").getpath(); system.out.println(path); file file = new file(path+"static/images/upload/"); if(!file.exists()){ file.mkdirs(); } header.transferto(new file(path+"static/images/upload/"+originalfilename)); return "注册用户成功/文件上传成功"; }}
3.引出两个问题1.文件覆盖问题
上面的示例中实现了文件的上传,但当两个不同的文件文件名相同时会存在文件覆盖的问题,如何解决呢?
@postmapping("/upload")@responsebodypublic string upload(@requestparam("name") string name, @requestparam("email") string email, @requestparam("age") integer age, @requestparam("job") string job, @requestparam("header") multipartfile header, @requestparam("photos") multipartfile[] photos) throws ioexception { log.info("name:{},email:{},age:{},job:{},header.size:{},photos.length:{}",name,email,age,job,header.getsize(),photos.length); //1.获取源文件名称 string originalfilename = header.getoriginalfilename(); originalfilename = uuid.randomuuid().tostring().replaceall("-","")+system.nanotime()+originalfilename; //2.获取文件上传的路径 // /e:/ideaprojects/springboot-sysuser/target/classes/ string path = resourceutils.geturl("classpath:").getpath(); system.out.println(path); //3.动态的创建文件上传目录 file file = new file(path+"static/images/upload/"); if(!file.exists()){ file.mkdirs(); } //4.将文件传输到目标目录 header.transferto(new file(path+"static/images/upload/"+originalfilename)); return "注册用户成功/文件上传成功";}
originalfilename = uuid.randomuuid().tostring().replaceall("-","")+system.nanotime()+originalfilename;,实现思路就是给上传的文件重新指定一个不重复的文件名
2.将文件都上传到一个目录下,当上传文件很多时,会造成访问文件速度变慢
解决思路:将文件上传到不同目录 比如 一天上传的文件,统一放到 一个文件夹 年/月/日, 比如 2022/11/11 目录
public class webutils { //定义一个文件上传的路径 public static string upload_file_directory = "static/images/upload/"; //编写方法,生成一个目录-根据当前日期 年/月/日 public static string getuploadfiledirectory() { return upload_file_directory + new simpledateformat("yyyy/mm/dd").format(new date()); }}
@postmapping("/upload")@responsebodypublic string upload(@requestparam("name") string name, @requestparam("email") string email, @requestparam("age") integer age, @requestparam("job") string job, @requestparam("header") multipartfile header, @requestparam("photos") multipartfile[] photos) throws ioexception { //输出获取到的信息 log.info("上传的信息 name={} email={} age={} job={} header={} photos={} ", name, email, age, job, header.getsize(), photos.length); //得到类路径(运行的时候) string path = resourceutils.geturl("classpath:").getpath(); //log.info("path={}", path); //动态创建指定目录 file file = new file(path + webutils.getuploadfiledirectory()); if (!file.exists()) {//如果目录不存在,我们就创建, 在java io file.mkdirs(); } if (!header.isempty()) {//处理头像 //获取上传文件的名字 string originalfilename = header.getoriginalfilename(); string filename = uuid.randomuuid().tostring() + "_" + system.currenttimemillis() + "_" + originalfilename; //保存到动态创建的目录 header.transferto(new file(file.getabsolutepath() + "/" + filename)); } //处理多个文件 if (photos.length > 0) { for (multipartfile photo : photos) {//遍历 if (!photo.isempty()) { string originalfilename = photo.getoriginalfilename(); string filename = uuid.randomuuid().tostring() + "_" + system.currenttimemillis() + "_" + originalfilename; //保存到动态创建的目录 photo.transferto(new file(file.getabsolutepath() + "/" + filename)); } } } return "注册用户成功/文件上传成功";}
以上就是springboot文件上传功能如何实现的详细内容。
