【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

相关推荐
Decay__7 小时前
VMware 安装 SQL Server 双节点 AlwaysOn 可用性组教程 —— WSFC、AG 与侦听器完整部署(系列核心篇)
运维·数据库·sql·mysql·架构
测试界的小码农7 小时前
【Linux 命令实战(06):Linux 文件权限管理,掌握 chmod、chown、chgrp】
linux·运维·服务器
陈希1238 小时前
负载均衡与高可用:LVS、HAProxy、Keepalived 实战
运维·负载均衡·lvs
SQL7712 小时前
IT运维发展史,一部宏伟史诗
运维·运维发展史
分布式存储与RustFS13 小时前
Terraform 状态文件老在本地丢、并发还撞锁:把 state 锁进 RustFS
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
csdn_aspnet13 小时前
macOS 10 、Docker 玩轉 MySQL
运维·mysql·macos·docker·容器·mac
爱和冰阔落15 小时前
【Linux网络】TCP 半包粘包怎么解决?从长度报头、JSON 拆包到网络计算器完整实战
linux·运维·网络·tcp/ip
无奈笑天下1 天前
银河麒麟上nproc命令教程详解
linux·运维·服务器
威嵌神州1 天前
嵌入式排故实录:高并发下串口数据“超时丢包”的根因剖析与架构优化
运维·服务器·嵌入式硬件·缓存
Decay__1 天前
SQLServer 索引与 SQL 优化 —— 聚集索引、非聚集索引、覆盖索引、碎片维护与执行计划
运维·数据库·sql·mysql·架构