当前位置: 首页 > news >正文

通过反射修改MultipartFile类文件名

1、背景
项目上有这样一个需求,前端传文件过来,后端接收后按照特定格式对文件进行重命名。(修改文件名需求其实也可以在前端处理的)

//接口类似于下面这个样子
@PosMapping("/uploadFile")
public R uploadFile(List<MultipartFile> fileList)

2、问题

本来以为通过set方法修改一下文件名就行,但是去操作时发现MultipartFile类并没有set方法,就没办法通过set直接修改文件名了。
在这里插入图片描述

3、解决方案
网上的解决方案基本都是从文件流下手,拷贝文件流后把文件流写入新文件。
这里介绍一种新的解决方案通过反射修改MultipartFile类文件的文件名。

/*** 通过反射重命名文件名* @param fileList* @param name* @return*/public void rename(List<MultipartFile> fileList, String newFileName){for(MultipartFile file:fileList){//此处需要获取filename字段 而不是name或者originalFilename字段 //ReflectUtil工具类来自于hutool工具类//import cn.hutool.core.util.ReflectUtil;ReflectUtil.setFieldValue(file,"filename",newFileName);}}

注意:

ReflectUtil.setFieldValue(file,"filename",newFileName);`

这行代码此处需要替换filename字段 而不是MultipartFile类的name或originalFilename字段(通过debug发现,springboot在处理文件时,并没有直接操作MultipartFile这个类,而是通过操作StandardMultipartHttpServletRequest类来处理的,可见下图,这里可能理解的不太正确,因为我也是debug发现这个现象,等我知道原理里就把括号内的内容删掉)
在这里插入图片描述
当然,如果不是通过mvc三层处理文件,只是想普通的替换一下文件名,还是需要替换MultipartFile类的name或originalFilename字段,参考如下

ReflectUtil.setFieldValue(file,"name",newFileName);

或者

ReflectUtil.setFieldValue(file,"originalFilename",newFileName);

4、补充
ReflectUtil工具类来自于hutool工具类
hutool工具类的maven参考依赖

			<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.12</version></dependency>
http://www.lryc.cn/news/280505.html

相关文章:

  • Macos下修改Python版本
  • 多种采购方式下,数智化招标采购系统建设解决方案
  • Java选择排序
  • [足式机器人]Part3 机构运动学与动力学分析与建模 Ch00-1 坐标系与概念基准
  • 【金猿人物展】DataPipelineCEO陈诚:赋能数据应用,发挥未来生产力
  • 4D 毫米波雷达:智驾普及的新路径(二)
  • element plus自定义组件表单校验
  • C //练习 4-13 编写一个递归版本的reverse(s)函数,以将字符串s倒置。
  • DNS解析和主从复制
  • 光猫(无限路由器)插入可移动硬盘搭建简易版的NAS
  • SpringIOC之support模块GenericGroovyApplicationContext
  • Awesome 3D Gaussian Splatting Resources
  • 【镜像压缩】linux 上 SD/TF 卡镜像文件压缩到实际大小的简单方法(树莓派、nvidia jetson)
  • Zookeeper 和 naocs的区别
  • 2-6基础算法-快速幂/倍增/构造
  • 行业内参~移动广告行业大盘趋势-2023年12月
  • 【笔记】书生·浦语大模型实战营——第四课(XTuner 大模型单卡低成本微调实战)
  • 开源的Immich自建一个堪比 iCloud 的私有云相册和备份服务
  • SPI通信讲解
  • 本地一键部署grafana+prometheus
  • NIO核心依赖多路复用小记
  • 如何彻底卸载 Microsoft Edge?
  • JavaScript-对象-笔记
  • java 运算符 选择语句
  • CNN:Convolutional Neural Network(上)
  • 将Android应用修改为鸿蒙应用的工作
  • 03 Strategy策略
  • Python实现分位数回归模型(quantreg算法)项目实战
  • 【ROS2简单例程】基于python的发布订阅实现
  • 【期末考试】数据库综合复习宝典