扩展MP提供的方法、实现文件上传功能

简介: MP接口方法扩展,文件上传功能实现

关于扩展MP提供的方法

在以前学习OOP中继承的时候,讲到若在一组继承关系中,如果MP提供的方法不够用,那么可以选择扩展父类的方法。大家都知道,MP的特色就是开发者不用写SQL,而这背后的原理是在一次又一次接口的实现、类的继承中体现的(直接调用事先封装好的方法)。

image.png

但是它内部封装好的方法并不能帮助我们解决万难,在一些特殊的场景我们不能局限于使用它提供的方法,针对场景要进行适当“改装”。所以,当“时机成熟之时”我们可以重写父类的方法,来扩展原有方法的功能。
image.png

当实体间存在联系,也就是几张表之间相互关联。如果想要删除表中的一则信息我们肯定是要考虑他与其他实体的联系,比如:我删除一个菜类表中的一条数据,这个菜类下可能有菜品,也可能关联套餐,如果直接remove()掉选中的菜类,那么我另两个实体中的数据就会丢失!

image.png

所以,我如果想要删除菜类的数据,仅仅通过MP提供的remove()方法显然是不够严谨全面的。在通过service调用remove()方法之前得加上贴合实际场景的判断条件。

这就要求我们对MP()封装的方法进行改进,怎么改进呢?反正层与层之间是继承、实现,那我在接口里重新定义一个remove()方法把之前的覆盖不就🆗了,反正在Controller层中我们是通过接
image.png

文件上传

文件上传,也称为upload,是指将本地图片、视频、音频等文件上传到服务器上,文件上传与下载可谓是在生活中应用十分广泛,一次上传对应一次请求,后端要做的是如何把这次请求中的文件信息转存到指定的地址

image.png

以上传图片为例

在表单里,当点击或者拖拽文件上传,前端页面就会发出一次如下的请求:

image.png

在后端的Controller层中怎样才能接受到前端发来的文件呢?这就要用到Apache为我们提供的两个组件,commons-fileupload与commons-io,本质是对文件的i/o操作

基于上面两个组件,Spring框架在spring-web包中对文件上传进行了封装,大大简化了服务端代码,所以只需要在Controller的方法中声明一个MultipartFile类型的参数即可接收上传的文件,就像这样:

public class CommonController {

    @Value("${reggie.path}") //@Value注解读取配置文件中reggie的值
    private String Basepath;

    @PostMapping("/upload")
    public R<String> upload(MultipartFile file) {
        //file是一个指定文件,必须转存到指定位置,这里的形参必须命名为file!
        log.info(file.toString());
    String usedName= file.getOriginalFilename();//原始名
        //将临时文件转存到电脑硬盘
        try {
            //通过配置文件的形式将转存路径变得更灵活
            file.transferTo(new File(Basepath+usedName));
        } catch (IOException e) {
            e.printStackTrace();
        }  
        return R.success(usedName);
    }
}

要注意这里的形参必须定义为file,与前端中的表单信息一致,否则文件信息不会传到方法里。
image.png

当在前端页面上传文件过后,文件信息就被存到了一个tomcat临时目录中,在本地电脑中可以找到

image.png

为了实现完整的上传功能,需要将临时的文件转存到指定的位置中,如果不转存,下一次刷新文件信息就会丢失 file.transferTo(new File(Basepath+usedName));

改进

大家可能会发现,usedName就是用户上传文件的文件名,但难免会出现重名的情况,为了避免我们可以使用UUID生成随机文件名,但是生成的id没有“.jpg”的的后缀,所以还需要动态地去截取一下usedName,就像这样:

      String usedName= file.getOriginalFilename();//原始名
      String jpg = usedName.substring(usedName.lastIndexOf("."));//截取.jpg后缀
      String uuidName= UUID.randomUUID().toString()+jpg;//使用UUID生成32位随机名

在SpringBoot的配置类中,转存目录path是我自定义的,这就需要考虑目录存不存在的问题,对此应在转存前加上判断条件,就像这样:

//创建一个目录对象
File file1 = new File(Basepath);
//如果目录不存在
if (!(file1.exists())){
    file1.mkdirs();//就按照Basepath创建一个目录
}
相关文章
|
数据挖掘
R语言中的动态线性模型
【4月更文挑战第27天】本文探讨了R语言中动态线性模型(DLMS)在处理自相关时间序列数据的应用。DLMs基于状态空间模型,包含观测和状态方程,能适应新信息并进行预测。使用`dlm`包可构建和估计模型,通过实例展示了如何预测股票价格。模型解释与验证涉及拟合优度、预测准确性和模型诊断。R还支持多变量、非线性及贝叶斯DLMs等高级主题,扩展了时间序列分析的能力。`dlm`包与其他工具一起,使R成为动态线性模型分析的强大平台。
414 1
|
监控 数据挖掘 API
唯品会商品列表接口(唯品会 API 系列)
唯品会商品列表接口助力电商数据分析、竞品调研和价格监控。开发者可通过合法途径获取接口权限,使用HTTP GET/POST请求获取商品名称、价格等信息,返回JSON格式数据。Python示例代码展示如何调用接口并解析返回数据。应用场景涵盖市场调研、价格监控、数据挖掘与分析及电商运营优化,为企业决策提供有力支持。
|
缓存 数据处理 数据库
Django 框架高级进阶:探索最佳实践与性能优化
【5月更文挑战第18天】在Django开发中,掌握高级技巧和性能优化是关键。最佳实践包括合理组织代码结构、数据库设计优化、使用信号机制和缓存策略。性能优化涉及数据库查询优化(如select_related和prefetch_related)、异步任务处理(如Celery)、启用HTTP缓存、优化模板渲染和服务器配置调整。示例中,通过分页减少数据加载量以提高性能。不断探索和应用这些方法能提升用户体验,应对高并发和大规模数据挑战。
464 6
|
存储 安全 算法
什么是秒合约?竞猜游戏交易所app系统开发规则介绍
秒合约是一种基于区块链技术的超短期衍生品合约,交易周期以秒为单位。它通过智能合约实现交易的自动化和去信任化,优化执行流程,提高交易速度和效率。秒合约适合高风险投机者,收益和风险固定,不使用杠杆。此外,竞猜游戏交易所app系统也涉及快速交易和投机,需确保安全、稳定及合规运营。
|
人工智能 C# 开发者
C#编程中的图形界面设计
【4月更文挑战第21天】本文探讨了C#在GUI设计中的应用,介绍了Windows Forms、WPF和UWP等常用框架,强调了简洁界面、响应式设计和数据绑定等最佳实践。通过实际案例,展示了C#在企业应用、游戏开发和移动应用中的GUI实现。随着技术发展,C#在GUI设计的未来将趋向于跨平台、更丰富的组件和AI集成,为开发者创造更多可能性。
1083 2
|
监控 jenkins 持续交付
Jenkins 面试题及答案整理,最新面试题
Jenkins 面试题及答案整理,最新面试题
1375 0
|
JSON 并行计算 API
使用CJSON/Nlohmann:快速简便地在C/C++中处理JSON数据
使用CJSON/Nlohmann:快速简便地在C/C++中处理JSON数据
3514 0
|
SpringCloudAlibaba Java Spring
阿里内部最新教材:Spring+SpringBoot+SpringCloud全家桶第五版
给大家分享的就是一份来自阿里的Spring+SpringBoot+SpringCloud全家桶实战手册!本手册包含了spring源码+springboot+springcloudAlibaba全彩笔记!
|
缓存 移动开发 小程序
从零玩转系列之微信支付实战Uni-App微信授权登录和装修下单页面和搭建下单接口以及发起下单请求3
从零玩转系列之微信支付实战Uni-App微信授权登录和装修下单页面和搭建下单接口以及发起下单请求3
480 0
408王道操作系统强化——PV大题解构(上)
408王道操作系统强化——PV大题解构
884 1
408王道操作系统强化——PV大题解构(上)

热门文章

最新文章