【SpringBoot】Day11-03 文件存储

本地存储

受限

开发中比较少用

如果直接存储在服务器的磁盘目录中,存在以下缺点:

  • 不安全:磁盘如果损坏,所有的文件就会丢失

  • 容量有限:如果存储大量的图片,磁盘空间有限(磁盘不可能无限制扩容)

  • 无法直接访问

为了解决上述问题呢,通常有两种解决方案:

  • 自己搭建存储服务器,如:fastDFS 、MinIO

  • 使用现成的云服务,如:阿里云,腾讯云,华为云

Controller 层

  • 需要注意的是:
    • 避免相同文件名的覆盖,所以采取了使用UUID
    • 但是使用UUID也只是随机生成一个文件名,但是没有后缀,因此,需要获得后缀,之后加上去

MultipartFile 常见方法:

  • String getOriginalFilename(); //获取原始文件名

  • void transferTo(File dest); //将接收的文件转存到磁盘文件中

  • long getSize(); //获取文件的大小,单位:字节

  • byte[] getBytes(); //获取文件内容的字节数组

  • InputStream getInputStream(); //获取接收到的文件内容的输入流

java 复制代码
@Slf4j
@RestController
public class UploadController {

    @PostMapping("/upload")
    public Result upload(String name, Integer age, MultipartFile image) throws IOException {
        log.info("文件上传 {},{},{}",name,age,image);

        //获取原始文件名
        /**
         * 直接使用原始名是有问题的,如果相同的命名文件上次,会覆盖之前的文件
         */
        String originalFilename = image.getOriginalFilename();

        // 构造唯一的文件名(不能重复) --uuid(通用唯一识别码) 然后还需要加上扩展名
        //截取最后一个.后面的即是扩展名

        String extname=originalFilename.substring(originalFilename.lastIndexOf("."));
        String newFilename= UUID.randomUUID().toString()+extname;   //随机名+文件扩展名
        //将文件存储在服务器磁盘中 E:\images
        /**
         * 文件名不能写死,避免只有一个文件,和文件格式不一样的情况
         * 下面这个方法会爆红,需要抛出异常
         */
        image.transferTo(new File("E:\\images\\"+newFilename));

        return Result.success();
    }
}

解除限制大小

那么如果需要上传大文件,可以在application.properties进行如下配置:

复制代码
配置单个文件最大上传大小
spring.servlet.multipart.max-file-size=10MB
​
配置单个请求最大上传大小(一次请求可以上传多个文件)
spring.servlet.multipart.max-request-size=100MB

阿里云OS

相关推荐
Yang961110 分钟前
12 小时续航 + 1.5kg 便携!鼎讯信通 OTDR 适配复杂野外运维
运维·网络
身如柳絮随风扬12 分钟前
Nginx 核心配置与实战解析:从入门到进阶
运维·nginx
xiaoduo AI34 分钟前
智能客服机器人能精准预判用户疑问提前主动应答吗?能大幅缩短客户咨询沟通时长吗?
运维·服务器·机器人
勤劳的进取家36 分钟前
服务器文件交互方式
运维·服务器·microsoft
yyuuuzz1 小时前
aws亚马逊云上部署常见问题梳理
运维·服务器·网络·数据库·云计算·aws
优化Henry1 小时前
5G站点光链路降级告警排查与处理——AAS光端口隐性故障定位
运维·网络·5g·信息与通信
wanhengidc1 小时前
算力服务器的优势都有哪些?
大数据·运维·服务器·网络·人工智能·安全·智能手机
bukeyiwanshui1 小时前
20260508 docker教案
运维·docker·容器
King's King1 小时前
自动化立体仓库项目立项申请报告
运维·自动化
xingyuzhisuan2 小时前
风冷还是水冷?RTX 4090服务器散热方案对比
运维·服务器·ai·gpu算力