Springboot MultipartFile文件上传与下载
yml文件配置是否可以上传及上传附件大小
servlet:multipart:# 允许文件上传enabled: true# 单个文件大小max-file-size: 20MB# 设置总上传的文件大小max-request-size: 50MB
/*** @param files* @param request* @Description 上传文件* @Throws* @Return java.util.List* @Date 2023-08-02 12:11:02* @Author WangKun*/@PostMapping("/upload")public List<JSONObject> upload(@RequestParam("uploadFiles") MultipartFile[] files, HttpServletRequest request) {List<JSONObject> list = new ArrayList<>();for (MultipartFile file : files) { //循环保存文件JSONObject result = new JSONObject();String msg = "";//判断上传文件格式String fileType = file.getContentType();// 要上传的目标文件存放的绝对路径String path = ClassUtils.getDefaultClassLoader().getResource("").getPath() + "imags";//文件名String fileOldName = file.getOriginalFilename();if (StringUtils.isNotBlank(fileOldName) && StringUtils.isNotEmpty(fileOldName)&& StringUtils.isNotBlank(fileType) && StringUtils.isNotEmpty(fileType)) {//获取文件后缀名String suffixName = fileOldName.substring(fileOldName.lastIndexOf("."));//重新生成文件名String fileNewName = UUID.randomUUID() + suffixName;// 上传if (FileUtils.upload(file, path, fileNewName)) {// 保存数据库信息String id = addAnnex(fileNewName, fileOldName, path, fileType, file.getSize());if (StringUtils.isNotBlank(id) && StringUtils.isNotEmpty(id)) {result.put("fileName", fileNewName);result.put("id", id);msg = "文件上传成功";}} else {msg = "文件上传失败";}}else{msg = "文件名或文件类型为空";}result.put("msg", msg);list.add(result);}return list;}
文件上传到了:\target\classes\imags中

下载:
/*** @param id* @param response* @Description 文件下载* @Throws* @Return java.util.List<com.alibaba.fastjson2.JSONObject>* @Date 2023-08-02 13:24:41* @Author WangKun*/@GetMapping("/download")public void download(@RequestParam("id") String id, HttpServletRequest request, HttpServletResponse response) {Annex annex = annexService.selectAnnex(id);String fileName = annex.getFileNewName();String charsetCode = String.valueOf(StandardCharsets.UTF_8);try {File file = new File(annex.getFilePath() + File.separator + fileName);//中文乱码解决String type = request.getHeader("User-Agent").toLowerCase();// 字符编码格式if (type.indexOf("firefox") > 0 || type.indexOf("chrome") > 0) {//谷歌或火狐fileName = new String(fileName.getBytes(charsetCode), "iso8859-1");} else {//IEfileName = URLEncoder.encode(fileName, charsetCode);}// 设置响应的头部信息response.setHeader("content-disposition", "attachment;filename=" + fileName);// 设置响应内容的类型response.setContentType(FileUtils.fileContentType(fileName) + "; charset=" + charsetCode);// 设置响应内容的长度response.setContentLength((int) file.length());// 输出FileUtils.outStream(Files.newInputStream(file.toPath()), response.getOutputStream());} catch (Exception e) {log.error("文件下载异常{}", e.getMessage());}}
文件工具类:
/*** @Description 文件上传工具* @Author WangKun* @Date 2023/8/2 10:28* @Version*/
@Slf4j
public class FileUtils {/*** @param file* @param path* @param fileName* @Description 保存文件* @Throws* @Return boolean* @Date 2023-08-02 12:10:39* @Author WangKun*/public static boolean upload(MultipartFile file, String path, String fileName) {String realPath = path + "\\" + fileName;File dest = new File(realPath);//判断文件父目录是否存在if (!dest.getParentFile().exists()) {dest.getParentFile().mkdir();}try {//保存文件file.transferTo(dest);return true;} catch (IllegalStateException | IOException e) {log.error("文件上传{} 异常", e.getMessage(),e);e.printStackTrace();return false;}}/*** @param name* @Description 设置响应头部信息* @Throws* @Return java.lang.String* @Date 2023-08-02 13:39:15* @Author WangKun*/public static String fileContentType(String name) {String result = "";String fileType = name.toLowerCase();if (fileType.endsWith(".png")) {result = "image/png";} else if (fileType.endsWith(".gif")) {result = "image/gif";} else if (fileType.endsWith(".jpg") || fileType.endsWith(".jpeg")) {result = "image/jpeg";} else if (fileType.endsWith(".svg")) {result = "image/svg+xml";} else if (fileType.endsWith(".doc")) {result = "application/msword";} else if (fileType.endsWith(".xls")) {result = "application/x-excel";} else if (fileType.endsWith(".zip")) {result = "application/zip";} else if (fileType.endsWith(".pdf")) {result = "application/pdf";} else if (fileType.endsWith(".mpeg")) { //MP3result = "audio/mpeg";} else if (fileType.endsWith(".mp4")) {result = "video/mp4";} else if (fileType.endsWith(".plain")) {result = "text/plain";} else if (fileType.endsWith(".html")) {result = "text/html";} else if (fileType.endsWith(".json")) {result = "application/json";} else{result = "application/octet-stream";}return result;}/*** @param is* @param os* @Description 文件下载输出* @Throws* @Return void* @Date 2023-08-02 13:40:47* @Author WangKun*/public static void outStream(InputStream is, OutputStream os) {try {byte[] buffer = new byte[10240];int length = -1;while ((length = is.read(buffer)) != -1) {os.write(buffer, 0, length);os.flush();}} catch (Exception e) {log.error("文件下载{} 异常", e.getMessage(),e);} finally {try {os.close();is.close();} catch (IOException e) {log.error("关闭流{} 异常", e.getMessage(),e);e.printStackTrace();}}}}
相关文章:
Springboot MultipartFile文件上传与下载
yml文件配置是否可以上传及上传附件大小 servlet:multipart:# 允许文件上传enabled: true# 单个文件大小max-file-size: 20MB# 设置总上传的文件大小max-request-size: 50MB /*** param files* param request* Description 上传文件* Throws* Return java.util.List* Date 202…...
js this变量
js this变量 有个比较特殊的箭头函数没有自己的this,而是继承了外部作用域的this...
Ubuntu ip冲突,修改静态IP方法
虚拟机克隆Ubuntu造成的IP地址相同冲突的问题_虚拟机ip冲突怎么解决_昌哥不爱晚睡的博客-CSDN博客...
windows下dll文件的创建详细教程
1、前言 dll文件是啥,就不作过多赘述了。现在直接教大家如何创建与使用dll文件。 本文基于windows系统,使用的编译相关工具为visual studio 2019。 2、创建dll 2.1 创建dll工程 首先打开visual studio,然后选择创建新项目,在搜…...
一些Git Repo
文章目录 Fake-TcpWow Fishing Script模拟券商柜台 Fake-Tcp Fake-Tcp 自己写的一个伪装包测试。 尝试把UDP的包伪装成TCP包,再发送到Internet Wow Fishing Script 魔兽世界钓鱼脚本 自己写的魔兽世界钓鱼脚本,10.0初期钓鱼成功率90%以上。现在关服了…...
【Unity脚本开源】记录鼠标按下的位置和移动的距离来进行物体的旋转,并在鼠标释放后将物体恢复到初始旋转位置
♥️作者:白日参商 🤵♂️个人主页:白日参商主页 ♥️坚持分析平时学习到的项目以及学习到的软件开发知识,和大家一起努力呀!!! 🎈🎈加油! 加油!…...
金蝶软件实现导入Excel数据分录行信息到单据体分录行中
>>>适合KIS云专业版V16.0|KIS云旗舰版V7.0|K/3 WISE 14.0等版本<<< 金蝶软件中实现[导入Excel数据业务分录行]信息到[金蝶单据体分录]中,在采购订单|采购入库单|销售订单|销售出库单等类型单据中,以少量的必要字段在excel表格中按模板填列好,很方便快捷地从…...
C# 11 中的新增功能
本文内容 泛型属性泛型数学支持数值 IntPtr 和 UIntPtr字符串内插中的换行符 显示另外 11 个 C# 11 中增加了以下功能: 原始字符串字面量泛型数学支持泛型属性UTF-8 字符串字面量字符串内插表达式中的换行符列表模式文件本地类型必需的成员自动默认结构常量 str…...
Postman通用接口加密解决方案
前言: 很对小伙伴对于psotman接口加密不知道如何解决,这里给大家出了一个全网最详细的解决方案,希望能帮助到大家 问题 postman内置加密Api,但不支持RSA加解密码。如何用postman进入rsa加解密?postman中request对象…...
java,钉钉小程序免密登录
一、开发者后台统一登录 - 钉钉统一身份认证 登录钉钉开放平台 二、教程介绍 如何实现用户免登。免登是指用户进入应用后,无需输入钉钉用户名和密码,应用程序可自动获取当前用户身份,进而登录系统的流程。 三、准备工作 注册了钉钉管理员…...
基于docker部署的Selenium Grid分布式自动化测试
01、什么是Selenium Grid Selenium Grid是Selenium套件的一部分,它专门用于并行运行多个测试用例在不同的浏览器、操作系统和机器上。 Selenium Grid有两个版本——老版本Grid 1和新版本Grid 2。我们只对新版本做介绍,因为Selenium团队已经逐渐遗弃老版…...
目标和——力扣494
文章目录 题目描述解法:动态规划题目描述 解法:动态规划 nt findTargetSumWays(vector<int>& nums, int target){int sum...
sql 执行的顺序
在执行 SQL 查询时,通常会按照以下顺序进行处理: FROM 子句:指定要查询的表或视图。WHERE 子句:筛选满足特定条件的行。GROUP BY 子句:将结果按照指定的列进行分组。HAVING 子句:筛选满足特定条件的分组。…...
TCP收发信息(C++)
目录 一、介绍 二、收数据 三、发数据 一、介绍 tcp和udp的区别之一,即tcp是有连接的,udp是无连接的,udp收发数据的代码可以独立运行,tcp发数据前必须确保收数据的一方是打开的,否则无法建立连接。 二、收数据 tc…...
windows Socket简单编程实例
服务端 #include <winsock2.h> #include <string.h> #include <stdio.h> #include <stdlib.h>#pragma comment(lib, "Ws2_32.lib")void error_handing(const char* message) {fputs(message, stderr);fputc(\n, stderr);exit(1); } int mai…...
外企开展中国在线业务的三种网络加速方案:含免ICP备案CDN解决方案
中国作为全球除美国外最大的消费市场,是几乎每个国际化企业都想要深入挖掘的市场,但外国企业在中国开展在线业务需要面临一个比较特殊的挑战:互联网防火墙(GFW)。为此所有想要在中国市场有所作为的外企都需要首先解决这…...
室内UWB定位到达角(AOA)测量精度的提高
抽象的 本文表明,用于在视线 (LoS) 中定位标签的干涉定位系统的方位角测量精度可以通过利用脉冲无线电超宽带 (IR-UWB) 信号来提高,并且无需增加频率带宽。该解决方案采用相位相关 (PC) 方法,最初应用于连续波 (CW) 信号,后来适用于超宽带 (UWB) 脉冲信号。将获得的结果与…...
“深入理解JVM:探索Java虚拟机的内部工作原理“
标题:深入理解JVM:探索Java虚拟机的内部工作原理 摘要:本文将深入探索Java虚拟机(JVM)的内部工作原理,包括JVM的架构、类加载、内存管理、垃圾回收机制等方面。通过理解JVM的内部工作原理,我们…...
TC3XX - MCAL知识点(三十一):FlsLoader MCAL配置及代码实战
目录 1、概述 2、MCAL配置 2.1、FlsLoaderGeneral 2.2、FlsLoaderOptionalApi 2.3、FlsLoaderPFlash0ProtConfig 3、测试代码及结果 3.1、测试代码 3.1.1、初始化 3....
Yii2 mongodb分组查询
$data MongoDbModelName::getCollection()->aggregate([[$group > [_id > $user_id, //通过user_id分组去重total > [$sum > 1]],],[$match > [total > [$gt > 1]]]],[allowDiskUse > true]);相当于 select user_id,count(1) as total from Mongo…...
手机号码智能定位:3大核心功能解决企业用户的地理信息获取难题
手机号码智能定位:3大核心功能解决企业用户的地理信息获取难题 【免费下载链接】location-to-phone-number This a project to search a location of a specified phone number, and locate the map to the phone number location. 项目地址: https://gitcode.com…...
2026长沙GEO优化公司权威实测:基于稳定性与转化效率的TOP5服务商深度推荐
2026长沙GEO优化公司权威实测:基于稳定性与转化效率的TOP5服务商深度推荐2026年,生成式AI搜索已深度重塑商业决策与品牌获客的路径。在全国GEO(生成式引擎优化)的版图中,长沙凭借活跃的数字经济生态与扎实的产业基础&a…...
Midscene.js:重塑UI自动化的革命性AI视觉驱动方案
Midscene.js:重塑UI自动化的革命性AI视觉驱动方案 【免费下载链接】midscene AI-powered, vision-driven UI automation for every platform. 项目地址: https://gitcode.com/GitHub_Trending/mid/midscene 你是否曾为编写复杂的UI自动化脚本而头疼ÿ…...
实战指南:基于快马AI生成贴合业务场景的问卷系统,超越通用opencode
在开发一个在线问卷调查系统时,很多开发者会直接使用现成的opencode或开源组件。但实际业务中,通用方案往往难以完全匹配特定需求。最近我在InsCode(快马)平台上尝试了一个实战项目,通过AI生成高度定制化的问卷系统后台API,效果远…...
WeMod Patcher终极实战指南:3步解锁Pro功能的完整方案
WeMod Patcher终极实战指南:3步解锁Pro功能的完整方案 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer WeMod Patcher是一款开源的游戏辅助工…...
用ESP32和2.13寸电子价签墨水屏,DIY一个超省电的桌面网络时钟(附完整代码)
用ESP32和2.13寸电子价签墨水屏打造极简网络时钟:从硬件拆解到代码实战 在智能设备泛滥的今天,一块能安静显示时间且不打扰生活的时钟反而成了稀罕物。本文将带你用ESP32开发板和汉朔2.13寸电子价签墨水屏,打造一个年耗电量不足1度电的极简网…...
暗黑破坏神2存档编辑器:安全高效的d2s文件修改与角色属性调整工具
暗黑破坏神2存档编辑器:安全高效的d2s文件修改与角色属性调整工具 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 暗黑破坏神2存档编辑器(d2s-editor)是一款专为《暗黑破坏神2》玩家设计的开源…...
用QT5的QTcpSocket做一个TCP调试助手:连接单片机/服务器测试数据收发
用QT5打造专业级TCP调试助手:从基础通信到工业级工具开发 在嵌入式开发和物联网项目中,TCP通信调试是每个工程师都会遇到的常规需求。无论是与STM32单片机通信,还是测试PLC设备的网络功能,亦或是验证云服务器的数据接口࿰…...
EZSwiftExtensions 性能优化技巧:让你的扩展运行更快更稳定
EZSwiftExtensions 性能优化技巧:让你的扩展运行更快更稳定 【免费下载链接】EZSwiftExtensions :smirk: How Swift standard types and classes were supposed to work. 项目地址: https://gitcode.com/gh_mirrors/ez/EZSwiftExtensions EZSwiftExtensions …...
谷歌Gemini API 应用(二):多模态与安全实践
1. 多模态处理实战:当Gemini遇上图像与文本 第一次用Gemini Pro Vision分析自家猫咪照片时,我被它的理解能力惊到了——不仅能准确识别出"橘猫在抓沙发",还能推断出"猫咪可能处于换牙期需要磨牙玩具"。这种图文结合的智能…...
