JavaWeb:文件上传1

欢迎来到"雪碧聊技术"CSDN博客!

在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将不断探索Java的深邃世界,分享最新的技术动态、实战经验以及项目心得。

让我们一同在Java的广阔天地中遨游,携手提升技术能力,共创美好未来!感谢您的关注与支持,期待在"雪碧聊技术"与您共同成长!

目录

一、简介

1、什么是文件上传?

2、文件上传需要的两部分

①前端程序

②后端程序

3、举例

4、总结

二、本地存储

1、什么是本地存储?

2、初步代码

3、思考此时存在的问题

①不能以文件原始名称的形式存储

4、使用UUID来保证文件不被覆盖(唯一性)

①什么是UUID?

②截取原始文件名的后缀,并拼接上UUID,构成新文件名(唯一的)

③测试效果

5、目前仍存在的问题

①上传文件的大小有限制

②问题的原因

③配置好以后,再次上传那个2.84MB的图片,看看能否成功

6、MultipartFile的方法

7、本地存储文件的缺点

结语


一、简介

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]的下篇文章~~

相关推荐
Ciderw16 天前
块存储、文件存储和对象存储详细介绍
网络·数据库·nvme·对象存储·存储·块存储·文件存储
00圈圈1 个月前
iOS 本地存储地址(位置)
本地存储·1024程序员节·userdefaults
胡耀超2 个月前
序列化与反序列化深入分析:UUID案例的实践与JSON转换对比
java·json·uuid·序列化·反序列化
GoppViper2 个月前
golang 如何生成唯一的 UUID
开发语言·后端·golang·uuid
Crazy Struggle3 个月前
.NET 8.0 文档管理系统网盘功能的实现
文件存储·.net 8.0·文档管理系统
tmax52HZ4 个月前
Leaf分布式ID
uuid·雪花算法·分布式id·snowflake·leaf
CodeSingerAlex4 个月前
Go 语言 UUID 库 google/uuid 源码解析:UUID version7 的实现
开发语言·数据库·后端·golang·uuid·源码解析·id
大小胖虎5 个月前
专业课笔记——(第十二章:文件的读写)
c语言·笔记·字符串·文件·文件存储·文件的读写
『 时光荏苒 』5 个月前
js生成UUID确保数据的唯一性
前端·javascript·vue.js·uuid