SpringBoot文件上传功能如何实现
导读:本文共3954.5字符,通常情况下阅读需要13分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要:本文小编为大家详细介绍“SpringBoot文件上传功能如何实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“SpringBoot文件上传功能如何实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1.应用实例需求: 演示 Spring-Boot 通过表单注册用户,并支持上传图片2.代码实现代码实现-文件上传创建 templates/upload.html , 要求头像... ...
目录
(为您整理了一些要点),点击可以直达。本文小编为大家详细介绍“SpringBoot文件上传功能如何实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“SpringBoot文件上传功能如何实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
1.应用实例
需求: 演示 Spring-Boot 通过表单注册用户,并支持上传图片
2.代码实现
代码实现-文件上传
创建 templates/upload.html , 要求头像只能选择一个, 而宠物可以上传多个图片
<!DOCTYPEhtml><htmllang="en"xmlns:th="http://www.thymeleaf.org"><head><metacharset="UTF-8"><title>upload</title></head><bodybgcolor="#CED3FE"><imgsrc="images/1.GIF"/><hr/><div><h2>注册用户~</h2><formaction="#"th:action="@{/upload}"method="post"enctype="multipart/form-data">用户名:<inputtype="text"name="name"/><br/><br/>电 邮:<inputtype="text"name="email"/><br/><br/>年 龄:<inputtype="text"name="age"/><br/><br/>职 位:<inputtype="text"name="job"/><br/><br/>头 像:<inputtype="file"name="header"><br/><br/>宠 物:<inputtype="file"name="photos"multiple><br/><br/><inputtype="submit"value="注册"/><inputtype="reset"value="重新填写"/></form></div><hr/></body></html>
2.创建src\main\java\com\llp\springboot\controller\UploadController.java
@Slf4j@ControllerpublicclassUploadController{//处理转发到用户注册-可以完成文件上传页面@GetMapping("/upload.html")publicStringuploadPage(){return"upload";//视图解析,转发到templates/upload.html}@PostMapping("/upload")@ResponseBodypublicStringupload(@RequestParam("name")Stringname,@RequestParam("email")Stringemail,@RequestParam("age")Integerage,@RequestParam("job")Stringjob,@RequestParam("header")MultipartFileheader,@RequestParam("photos")MultipartFile[]photos)throwsIOException{log.info("name:{},email:{},age:{},job:{},header.size:{},photos.length:{}",name,email,age,job,header.getSize(),photos.length);//1.获取源文件名称StringoriginalFilename=header.getOriginalFilename();///E:/IdeaProjects/springboot-sysuser/target/classes/Stringpath=ResourceUtils.getURL("classpath:").getPath();System.out.println(path);Filefile=newFile(path+"static/images/upload/");if(!file.exists()){file.mkdirs();}header.transferTo(newFile(path+"static/images/upload/"+originalFilename));return"注册用户成功/文件上传成功";}}
3.引出两个问题
1.文件覆盖问题
上面的示例中实现了文件的上传,但当两个不同的文件文件名相同时会存在文件覆盖的问题,如何解决呢?
@PostMapping("/upload")@ResponseBodypublicStringupload(@RequestParam("name")Stringname,@RequestParam("email")Stringemail,@RequestParam("age")Integerage,@RequestParam("job")Stringjob,@RequestParam("header")MultipartFileheader,@RequestParam("photos")MultipartFile[]photos)throwsIOException{log.info("name:{},email:{},age:{},job:{},header.size:{},photos.length:{}",name,email,age,job,header.getSize(),photos.length);//1.获取源文件名称StringoriginalFilename=header.getOriginalFilename();originalFilename=UUID.randomUUID().toString().replaceAll("-","")+System.nanoTime()+originalFilename;//2.获取文件上传的路径///E:/IdeaProjects/springboot-sysuser/target/classes/Stringpath=ResourceUtils.getURL("classpath:").getPath();System.out.println(path);//3.动态的创建文件上传目录Filefile=newFile(path+"static/images/upload/");if(!file.exists()){file.mkdirs();}//4.将文件传输到目标目录header.transferTo(newFile(path+"static/images/upload/"+originalFilename));return"注册用户成功/文件上传成功";}
originalFilename = UUID.randomUUID().toString().replaceAll("-","")+System.nanoTime()+originalFilename;
,实现思路就是给上传的文件重新指定一个不重复的文件名
2.将文件都上传到一个目录下,当上传文件很多时,会造成访问文件速度变慢
解决思路:将文件上传到不同目录 比如 一天上传的文件,统一放到 一个文件夹 年/月/日, 比如 2022/11/11 目录
publicclassWebUtils{//定义一个文件上传的路径publicstaticStringUPLOAD_FILE_DIRECTORY="static/images/upload/";//编写方法,生成一个目录-根据当前日期年/月/日publicstaticStringgetUploadFileDirectory(){returnUPLOAD_FILE_DIRECTORY+newSimpleDateFormat("yyyy/MM/dd").format(newDate());}}
@PostMapping("/upload")@ResponseBodypublicStringupload(@RequestParam("name")Stringname,@RequestParam("email")Stringemail,@RequestParam("age")Integerage,@RequestParam("job")Stringjob,@RequestParam("header")MultipartFileheader,@RequestParam("photos")MultipartFile[]photos)throwsIOException{//输出获取到的信息log.info("上传的信息name={}email={}age={}job={}header={}photos={}",name,email,age,job,header.getSize(),photos.length);//得到类路径(运行的时候)Stringpath=ResourceUtils.getURL("classpath:").getPath();//log.info("path={}",path);//动态创建指定目录Filefile=newFile(path+WebUtils.getUploadFileDirectory());if(!file.exists()){//如果目录不存在,我们就创建,在javaiofile.mkdirs();}if(!header.isEmpty()){//处理头像//获取上传文件的名字StringoriginalFilename=header.getOriginalFilename();StringfileName=UUID.randomUUID().toString()+"_"+System.currentTimeMillis()+"_"+originalFilename;//保存到动态创建的目录header.transferTo(newFile(file.getAbsolutePath()+"/"+fileName));}//处理多个文件if(photos.length>0){for(MultipartFilephoto:photos){//遍历if(!photo.isEmpty()){StringoriginalFilename=photo.getOriginalFilename();StringfileName=UUID.randomUUID().toString()+"_"+System.currentTimeMillis()+"_"+originalFilename;//保存到动态创建的目录photo.transferTo(newFile(file.getAbsolutePath()+"/"+fileName));}}}return"注册用户成功/文件上传成功";}
读到这里,这篇“SpringBoot文件上传功能如何实现”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。
SpringBoot文件上传功能如何实现的详细内容,希望对您有所帮助,信息来源于网络。