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

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&#xff0c;而是继承了外部作用域的this...

Ubuntu ip冲突,修改静态IP方法

虚拟机克隆Ubuntu造成的IP地址相同冲突的问题_虚拟机ip冲突怎么解决_昌哥不爱晚睡的博客-CSDN博客...

windows下dll文件的创建详细教程

1、前言 dll文件是啥&#xff0c;就不作过多赘述了。现在直接教大家如何创建与使用dll文件。 本文基于windows系统&#xff0c;使用的编译相关工具为visual studio 2019。 2、创建dll 2.1 创建dll工程 首先打开visual studio&#xff0c;然后选择创建新项目&#xff0c;在搜…...

一些Git Repo

文章目录 Fake-TcpWow Fishing Script模拟券商柜台 Fake-Tcp Fake-Tcp 自己写的一个伪装包测试。 尝试把UDP的包伪装成TCP包&#xff0c;再发送到Internet Wow Fishing Script 魔兽世界钓鱼脚本 自己写的魔兽世界钓鱼脚本&#xff0c;10.0初期钓鱼成功率90%以上。现在关服了…...

【Unity脚本开源】记录鼠标按下的位置和移动的距离来进行物体的旋转,并在鼠标释放后将物体恢复到初始旋转位置

♥️作者&#xff1a;白日参商 &#x1f935;‍♂️个人主页&#xff1a;白日参商主页 ♥️坚持分析平时学习到的项目以及学习到的软件开发知识&#xff0c;和大家一起努力呀&#xff01;&#xff01;&#xff01; &#x1f388;&#x1f388;加油&#xff01; 加油&#xff01…...

金蝶软件实现导入Excel数据分录行信息到单据体分录行中

>>>适合KIS云专业版V16.0|KIS云旗舰版V7.0|K/3 WISE 14.0等版本<<< 金蝶软件中实现[导入Excel数据业务分录行]信息到[金蝶单据体分录]中,在采购订单|采购入库单|销售订单|销售出库单等类型单据中,以少量的必要字段在excel表格中按模板填列好,很方便快捷地从…...

C# 11 中的新增功能

本文内容 泛型属性泛型数学支持数值 IntPtr 和 UIntPtr字符串内插中的换行符 显示另外 11 个 C# 11 中增加了以下功能&#xff1a; 原始字符串字面量泛型数学支持泛型属性UTF-8 字符串字面量字符串内插表达式中的换行符列表模式文件本地类型必需的成员自动默认结构常量 str…...

Postman通用接口加密解决方案

前言&#xff1a; 很对小伙伴对于psotman接口加密不知道如何解决&#xff0c;这里给大家出了一个全网最详细的解决方案&#xff0c;希望能帮助到大家 问题 postman内置加密Api&#xff0c;但不支持RSA加解密码。如何用postman进入rsa加解密&#xff1f;postman中request对象…...

java,钉钉小程序免密登录

一、开发者后台统一登录 - 钉钉统一身份认证 登录钉钉开放平台 二、教程介绍 如何实现用户免登。免登是指用户进入应用后&#xff0c;无需输入钉钉用户名和密码&#xff0c;应用程序可自动获取当前用户身份&#xff0c;进而登录系统的流程。 三、准备工作 注册了钉钉管理员…...

基于docker部署的Selenium Grid分布式自动化测试

01、什么是Selenium Grid Selenium Grid是Selenium套件的一部分&#xff0c;它专门用于并行运行多个测试用例在不同的浏览器、操作系统和机器上。 Selenium Grid有两个版本——老版本Grid 1和新版本Grid 2。我们只对新版本做介绍&#xff0c;因为Selenium团队已经逐渐遗弃老版…...

目标和——力扣494

文章目录 题目描述解法:动态规划题目描述 解法:动态规划 nt findTargetSumWays(vector<int>& nums, int target){int sum...

sql 执行的顺序

在执行 SQL 查询时&#xff0c;通常会按照以下顺序进行处理&#xff1a; FROM 子句&#xff1a;指定要查询的表或视图。WHERE 子句&#xff1a;筛选满足特定条件的行。GROUP BY 子句&#xff1a;将结果按照指定的列进行分组。HAVING 子句&#xff1a;筛选满足特定条件的分组。…...

TCP收发信息(C++)

目录 一、介绍 二、收数据 三、发数据 一、介绍 tcp和udp的区别之一&#xff0c;即tcp是有连接的&#xff0c;udp是无连接的&#xff0c;udp收发数据的代码可以独立运行&#xff0c;tcp发数据前必须确保收数据的一方是打开的&#xff0c;否则无法建立连接。 二、收数据 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解决方案

中国作为全球除美国外最大的消费市场&#xff0c;是几乎每个国际化企业都想要深入挖掘的市场&#xff0c;但外国企业在中国开展在线业务需要面临一个比较特殊的挑战&#xff1a;互联网防火墙&#xff08;GFW&#xff09;。为此所有想要在中国市场有所作为的外企都需要首先解决这…...

室内UWB定位到达角(AOA)测量精度的提高

抽象的 本文表明,用于在视线 (LoS) 中定位标签的干涉定位系统的方位角测量精度可以通过利用脉冲无线电超宽带 (IR-UWB) 信号来提高,并且无需增加频率带宽。该解决方案采用相位相关 (PC) 方法,最初应用于连续波 (CW) 信号,后来适用于超宽带 (UWB) 脉冲信号。将获得的结果与…...

“深入理解JVM:探索Java虚拟机的内部工作原理“

标题&#xff1a;深入理解JVM&#xff1a;探索Java虚拟机的内部工作原理 摘要&#xff1a;本文将深入探索Java虚拟机&#xff08;JVM&#xff09;的内部工作原理&#xff0c;包括JVM的架构、类加载、内存管理、垃圾回收机制等方面。通过理解JVM的内部工作原理&#xff0c;我们…...

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…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...