欢迎来到"雪碧聊技术"CSDN博客!
在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将不断探索Java的深邃世界,分享最新的技术动态、实战经验以及项目心得。
让我们一同在Java的广阔天地中遨游,携手提升技术能力,共创美好未来!感谢您的关注与支持,期待在"雪碧聊技术"与您共同成长!
目录
②截取原始文件名的后缀,并拼接上UUID,构成新文件名(唯一的)
一、简介
1、什么是文件上传?
文件上传:是指将本地图片、视频、音频等文件上传到服务器,供其他用户浏览或下载的过程。
举例:发微博、微信朋友圈都需要用到文件上传功能。
2、文件上传需要的两部分
①前端程序
三要素:
- 必须有一个类型为file的输入框
- form表单的提交方式必须是post
- 在form表单中,需要使enctype这个属性为multipart/form-data
②后端程序
使用spring提供的MultipartFile来接收传递过来的文件。
举例:
3、举例
编写后端接收文件的controller
然后查看后端断点的信息:
将三个文件,改名为1.txt,2.txt,3.txt,然后查看文件内容。
然后放行断点:
由上面的过程可见,后端接收前端传递的文件时,会在Tomcat服务器生成对应的临时文件,我们接下来要做的就是将这些临时文件保存下来。可以选择保存到本地,也可以选择保存到阿里云OSS服务器。
4、总结
二、本地存储
1、什么是本地存储?
在服务端(后端),接收到上传的文件后,将文件存储在本地服务器磁盘中。
2、初步代码
java
@Slf4j
@RestController
public class UploadController {
@PostMapping("/upload")
public ResultVo upload(String username, Integer age, MultipartFile image) throws IOException {
log.info("文件上传:{},{},{}", username, age, image);
//获取原始文件名(通过getOriginalFilename方法)
String originalFilename = image.getOriginalFilename();//如:1.png hello.txt
//将文件存储在后端的磁盘目录中(通过transferTo方法)
image.transferTo(new File("D:\\code\\yyzxproject\\src\\main\\resources\\static\\files\\"+originalFilename));
return new ResultVo("200","上传成功");
}
}
测试效果:
利用postman,向后端传入一张图片:
3、思考此时存在的问题
①不能以文件原始名称的形式存储
举例:
我们第一次上传了一个张三的自拍,照片名称为01.jpg, 第二次又上传了一个李四的自拍,照片名称也叫01.jpg。 此时李四的自拍就会覆盖张三的自拍,这就导致少了一张照片。
产生上述图片覆盖的问题,根本原因就是文件名重复了。
因此我们存储文件时,要保证文件名的唯一性。
4、使用UUID来保证文件不被覆盖(唯一性)
①什么是UUID?
UUID也称为"通用唯一识别码",就是一个长度固定(36位)、唯一的字符串。
UUID是Java官方提供的,安装了JDK就可以使用该包。
举例:
java
public class Test6 {
public static void main(String[] args) {
String uuid = UUID.randomUUID().toString();
System.out.println(uuid);
}
}
运行结果:
②截取原始文件名的后缀,并拼接上UUID,构成新文件名(唯一的)
如:01.jpg的后缀是.jpg
java
@Slf4j
@RestController
public class UploadController {
@PostMapping("/upload")
public ResultVo upload(String username, Integer age, MultipartFile image) throws IOException {
log.info("文件上传:{},{},{}", username, age, image);
//获取原始文件名(通过getOriginalFilename方法)
String originalFilename = image.getOriginalFilename();//如:1.png hello.txt
//构造唯一的文件名
int index = originalFilename.lastIndexOf(".");//.出现的下标
String extname = originalFilename.substring(index);//从.的下标,截取到最后,结果就是后缀名。如.jpg
String newFileName = UUID.randomUUID().toString() + extname;
//将文件存储在后端的磁盘目录中(通过transferTo方法)
image.transferTo(new File("D:\\code\\yyzxproject\\src\\main\\resources\\static\\files\\"+newFileName));
return new ResultVo("200","上传成功");
}
}
也就是说,文件名是UUID,后缀还是原来的后缀。
③测试效果
5、目前仍存在的问题
①上传文件的大小有限制
我们把这个图片上传到后端,查看效果:
②问题的原因
Spring限制每次上传的单个文件大小不能超过1MB。
如果想超过,需要自己进行配置:
举例:
③配置好以后,再次上传那个2.84MB的图片,看看能否成功
6、MultipartFile的方法
7、本地存储文件的缺点
- 前端页面无法直接访问后端的文件
举例:
- 服务器(后端)磁盘的容量有限,满了的时候,扩容很不方便
- 服务器(后端)磁盘一旦损坏,存储的所有文件资源就会全部丢失
结语
以上就是本地存储文件的全部内容,但这种存储方式的确不常用,我们学习本篇文章,是为了解MultipartFile对象以及本地存储方式的缺点。
想了解阿里云存储文件,请关注本博主本专栏[JavaWeb]的下篇文章~~