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();}}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/43112.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

南大通用数据库(Gbase 8s) 创建UDR外部函数

一、在使用 date_format、from_unixtime、to_days、yearweek 函数时&#xff0c;Gbase 8s 数据库不支持&#xff0c;可以使用创建 UDR 外部函数来实现 二、登录命令控制台或者使用 navicat 连接 Gbase 数据库 这里使用 navicat &#xff0c;点击新增连接选择 PostGreSql 驱动…

动手学深度学习—卷积神经网络LeNet(代码详解)

1. LeNet LeNet由两个部分组成&#xff1a; 卷积编码器&#xff1a;由两个卷积层组成&#xff1b;全连接层密集块&#xff1a;由三个全连接层组成。 每个卷积块中的基本单元是一个卷积层、一个sigmoid激活函数和平均汇聚层&#xff1b;每个卷积层使用55卷积核和一个sigmoid激…

LeetCode--HOT100题(35)

目录 题目描述&#xff1a;23. 合并 K 个升序链表&#xff08;困难&#xff09;题目接口解题思路1代码解题思路2代码 PS: 题目描述&#xff1a;23. 合并 K 个升序链表&#xff08;困难&#xff09; 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合…

UDP 的报文结构以及注意事项

UDP协议 1.UDP协议端格式 1.图中的16位UDP长度,表示整个数据报(UDP首部UDP数据)的最大长度 2.若校验和出错,会直接丢弃 2.UDP的报文结构 UDP报文主体分为两个部分:UDP报头(占8个字节)UDP载荷/UDP数据 1.源端口号 16位,2个字节 2.目的端口号 16位,2个字节 3.包长度 指示了…

sd-webui安装comfyui扩展

文章目录 导读ComfyUI 环境安装1. 安装相关组件2. 启动sd-webui3. 访问sd-webui 错误信息以及解决办法 导读 这篇文章主要给大家介绍如何在sd-webui中来安装ComfyUI插件 ComfyUI ComfyUI是一个基于节点流程式的stable diffusion的绘图工具&#xff0c;它集成了stable diffus…

两个list如何根据一个list中的属性去过滤掉另一个list中不包含这部分的属性,用流实现

你可以使用Java 8的流来实现这个功能。假设你有两个包含对象的List&#xff0c;每个对象有一个属性&#xff0c;你想根据一个List中的属性值来过滤掉另一个List中不包含这个属性值的对象。下面是一种使用流的方式来实现这个功能 import java.util.ArrayList; import java.util…

什么是闭包(closure)?为什么它在JavaScript中很有用?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 闭包&#xff08;Closure&#xff09;是什么&#xff1f;⭐ 闭包的用处⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&…

IO流面试题

题目一&#xff1a; 在磁盘中新建一个文件(如果目录结构不存在&#xff0c;则创建目录) 文件名&#xff1a;data.txt 文件日录&#xff1a;C:\demo\test\files (盘符不限) linux目录~/demo/test/files 题二 在新建的data.txt中添加如下内容&#xff1a; 张三,测试,2019-02-18 …

windows10 安装WSL2, Ubuntu,docker

AI- 通过docker开发调试部署ChatLLM 阅读时长&#xff1a;10分钟 本文内容&#xff1a; window上安装ubuntu虚拟机&#xff0c;并在虚拟机中安装docker&#xff0c;通过docker部署数字人模型&#xff0c;通过vscode链接到虚拟机进行开发调试.调试完成后&#xff0c;直接部署在云…

优漫动游零基础如何学习好UI设计

智能时代的来临&#xff0c;很多企业都越来越注重用户体验这一块&#xff0c;想要有一个吸引用户的好页面&#xff0c;UI设计师岗位不可或缺&#xff0c;如今越来越多的人想要学习UI设计技术&#xff0c;那么对于零基础小白如何学习好UI设计呢? 零基础小白如何学习好UI设计…

变更通知在开源SpringBoot/SpringCloud微服务中的最佳实践

目录导读 变更通知在开源SpringBoot/SpringCloud微服务中的最佳实践1. 什么是变更通知2. 变更通知的场景分析3. 变更通知的技术方案3.1 变更通知的技术实现方案 4. 变更通知的最佳实践总结5. 参考资料 变更通知在开源SpringBoot/SpringCloud微服务中的最佳实践 1. 什么是变更通…

Ubuntu在自己的项目中使用pcl

1、建立一个文件夹&#xff0c;如pcl_demos&#xff0c;里面建立一个.cpp文件和一个cmake文件 2、打开终端并进入该文件夹下&#xff0c;建立一个build文件夹存放编译的结果并进入该文件夹 3、对上一级进行编译 cmake .. 4、生成可执行文件 make 5、运行该可执行文件 6、可视…

最强自动化测试框架Playwright(30)-JS句柄

在 Playwright 中&#xff0c;JSHandle 是一个表示浏览器中 JavaScript 对象的类。它提供了与网页中的 JavaScript 对象进行交互和操作的方法。 可以通过调用 Playwright中的 evaluateHandle 或 evaluate 方法来获取 JSHandle from playwright.sync_api import sync_playwrig…

微服务中间件-分布式缓存Redis

分布式缓存 a.Redis持久化1) RDB持久化1.a) RDB持久化-原理 2) AOF持久化3) 两者对比 b.Redis主从1) 搭建主从架构2) 数据同步原理&#xff08;全量同步&#xff09;3) 数据同步原理&#xff08;增量同步&#xff09; c.Redis哨兵1) 哨兵的作用2) 搭建Redis哨兵集群3) RedisTem…

金融语言模型:FinGPT

项目简介 FinGPT是一个开源的金融语言模型&#xff08;LLMs&#xff09;&#xff0c;由FinNLP项目提供。这个项目让对金融领域的自然语言处理&#xff08;NLP&#xff09;感兴趣的人们有了一个可以自由尝试的平台&#xff0c;并提供了一个与专有模型相比更容易获取的金融数据。…

Java根据List集合中的一个字段对集合进行去重

利用HashSet 创建了一个HashSet用于存储唯一的字段值&#xff0c;并创建了一个新的列表uniqueList用于存储去重后的对象。遍历原始列表时&#xff0c;如果字段值未在HashSet中出现过&#xff0c;则将其添加到HashSet和uniqueList中。 List<Person> originalList new Ar…

VS2015项目中,MFC内存中调用DLL函数(VC6生成的示例DLL)

本例主要讲一下&#xff0c;用VC6如何生成DLL&#xff0c;用工具WinHex取得DLL全部内容&#xff0c;VC2015项目加载内存中的DLL函数&#xff0c;并调用函数的示例。 本例中的示例代码下载&#xff0c;点击可以下载 一、VC6.0生成示例DLL项目 1.新建项目&#xff0c;…

mysql中的is null和空字符串

相比于oracle&#xff0c;mysql中的is null 和空坑就没那么多&#xff0c;直接写就行。 不为空 and (username is not null and username !)注&#xff1a; 不为空中间用的是and。 为空 and (username is null or username !)注&#xff1a; 为空中间用的是or。

java应用运行在docker,并且其他组件也在docker

docker启动redis容器 # create redis docker run -d --name redis-container -p 6379:6379 redis:latest创建java 应用 dockerfile FROM openjdk:17##Pre-create related directories RUN mkdir -p /data/etax/ms-app WORKDIR /data/etax/ms-appEXPOSE 10133 COPY ./target…

SQL Server Express 自动备份方案

文章目录 SQL Server Express 自动备份方案前言方案原理SQL Server Express 自动备份1.创建存储过程2.设定计划任务3.结果检查sqlcmd 参数说明SQL Server Express 自动备份方案 前言 对于许多小型企业和个人开发者来说,SQL Server Express是一个经济实惠且强大的数据库解决方…