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 {
                //IE
                fileName = 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")) { //MP3
            result = "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();
            }
        }
    }


}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

prometheus监控k8s服务并告警到钉钉

一、监控k8s集群 要监控k8s集群需要使用到以下服务用于收集监控的资源信息&#xff0c;node_exporter用于监控k8s集群节点的资源信息&#xff0c;kube-state-metrics用于监控k8s集群的deployment、statefulset、daemonset、pod等的状态&#xff0c;cadvisor用于监控k8s集群的p…

关于Linux文件系统只读问题的修改笔记

1.问题 2. 原因 系统异常关机或者代码修改错误导致硬盘挂载出现问题开启只读模式&#xff0c;但是重启有时候可以解决。 3.解决方法 1. mount查看那个挂载的硬盘出现问题(ro标识只读) mount | grep ro2.找到硬盘&#xff0c;重新挂载即可 sudo mount -o remount,rw /sys/f…

基于Googlenet深度学习网络的人员行为动作识别matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 1. 原理 1.1 深度学习与卷积神经网络&#xff08;CNN&#xff09; 1.2 GoogLeNet 2. 实现过程 2.1 数据预处理 2.2 构建网络模型 2.3 数据输入与训练 2.4 模型评估与调优 3. 应用领域…

python技术栈 之 单元测试中mock的使用

一、什么是mock&#xff1f; mock测试就是在测试过程中&#xff0c;对于某些不容易构造或者不容易获取的对象&#xff0c;用一个虚拟的对象来创建以便测试的测试方法。 二、mock的作用 特别是开发过程中上下游未完成的工序导致当前无法测试&#xff0c;需要虚拟某些特定对象…

3. 爬取自己CSDN博客列表(分页查询)(网站反爬虫策略,需要在代码中添加合适的请求头User-Agent,否则response返回空)

文章目录 步骤打开谷歌浏览器输入网址按F12进入调试界面点击网络&#xff0c;清除历史消息按F5刷新页面找到接口&#xff08;community/home-api/v1/get-business-list&#xff09;接口解读 撰写代码获取博客列表先明确返回信息格式json字段解读 Apipost测试接口编写python代码…

「已解决」iframe 本地生效 但是在测试环境不生效问题

背景 我有一个表格中一列是个详情&#xff0c;这个详情可被点击&#xff0c;点击后弹出抽屉&#xff0c;抽屉里是后端传给我详情字段的值对应的 url 的 iframe 展示。 问题是&#xff0c;在本地 localhost 下运行&#xff0c;ifame 运行正常&#xff0c;但是部署到测试环境就看…

到江西赣州ibm维修服务器之旅-联想X3850 x6黄灯故障

2023年08月15日&#xff0c;一位江西赣州工厂客户通过朋友介绍与冠峰售前工程师取得联系&#xff0c;双方对产品故障前后原因沟通的大致情况如下&#xff1a; 服务器型号&#xff1a;Lenovo system x3850 x6 为用户公司erp仓库服务器 服务器故障&#xff1a;正常使用过程中业…

第三章 图论 No.12欧拉回路与欧拉路径

文章目录 定义欧拉路径的性质&#xff1a;1123. 铲雪车边编号输出欧拉路径&#xff1a;1184. 欧拉回路点编号字典序最小输出欧拉路径&#xff1a;1124. 骑马修栅栏并查集判断有向图是否存在欧拉路径&#xff1a;1185. 单词游戏 定义 小学一笔画问题&#xff0c;每条边只经过一次…

Neo4j的使用场景_以及Windows版安装_欺诈检测_推荐_知识图谱---Neo4j图数据库工作笔记0003

可以看到使用场景,比如欺诈检测, 要建立图谱,才能进行,欺诈人员检测 可以看到图谱的各种应用场景 然后推荐引擎也需要,可以看到 在金融,旅行,求职招聘,保健,服务,媒体娱乐,都可以进行推荐 然后还有知识图谱 身份访问管理,这里,可以进行安全管理,可以挖掘出潜在关系,分析, 某…

Chapter 2 Crystal Dynamics 2.1 晶格振动

2.1 Lattice Vibration 晶格振动 Born-Oppenheimer Approximation Electrons’ movement: Electron theory free electron theoryenergy band theory Atoms’ movement crystal dynamicslattice vibration 当研究电子运动时&#xff0c;忽略原子运动&#xff1b;当研究原子…

JavaScript如何执行语句

目录 语法/词法分析 预编译 解释执行 预编译什么时候发生 js运行三步曲 预编译前奏 预编译步骤 巩固基础练习 语法/词法分析 按语句块的粒度解析成抽象语法树 ,分析该js脚本代码块的语法是否正确&#xff0c;如果出现不正确&#xff0c;则向外抛出一个语法错误&#x…

NSI45030AT1G LED驱动器方案为汽车外部及内部照明恒流稳流器(CCR)方案

关于线性恒流调节器&#xff08;CCR&#xff09;&#xff1a;是一种用于控制电流的稳定输出。它通常由一个功率晶体管和一个参考电流源组成。CCR的工作原理是通过不断调节功率晶体管的导通时间来维持输出电流的恒定。当输出电流超过设定值时&#xff0c;CCR会减少功率晶体管的导…

探索未来:元宇宙与Web3的无限可能

随着科技的奇迹般发展&#xff0c;互联网已经成为了我们生活的不可分割的一部分。然而&#xff0c;尽管它的便利性和普及性带来了巨大的影响&#xff0c;但我们仍然面临着传统互联网体验的诸多限制。 购物需要不断在实体店与电商平台间切换&#xff0c;教育依然受制于时间与地…

数据库信息速递 -- MariaDB 裁员后,前景不确定 (翻译)

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请加 liuaustin3微信号 &#xff0c;在新加的朋友会分到3群&#xff…

【教程】零成本将小米净化器改造为无叶风扇

某宝某多上&#xff0c;就这么点破塑料&#xff0c;就要买79&#xff1f;&#xff01;&#xff01; 我这枚韭菜可不上当。咱自己做一个&#xff01; 真香~

UNIX网络编程——TCP协议API 基础demo服务器代码

目录 一.TCP客户端API 1.创建套接字 2.connect连接服务器​编辑 3.send发送信息 4.recv接受信息 5.close 二.TCP服务器API 1.socket创建tcp套接字(监听套接字) 2.bind给服务器套接字绑定port,ip地址信息 3.listen监听并创建连接队列 4.accept提取客户端的连接 5.send,r…

Linux设备树详解

Linux 设备树详解 Linux 操作系统早期是针对个人电脑设备而开发的操作系统&#xff0c;而个人电脑处理器产商较为单一&#xff08;例如只有 Intel&#xff0c;AMD&#xff09;同时个人电脑产商均使用 Intel 或 AMD 制造的处理器&#xff0c;业界形成了统一的总线/硬件接口标准…

SQLSERVER 查询语句加with (NOLOCK) 报ORDER BY 报错 除非另外还指定了 TOP、OFFSET 或 FOR XML

最近有一个项目在客户使用时发现死锁问题&#xff0c;用的数据库是SQLSERVER &#xff0c;死锁的原因是有的客户经常去点报表&#xff0c;报表查询时间又慢&#xff0c;然后又有人在做单导致了死锁&#xff0c;然后主管要我们用SQLSERVER查询时要加with (NOLOCK),但是我在加完 …

Excel设置某列或者某行不某行不可以编辑,只读属性

设置单元格只读的三种方式: 1、通过单元格只读按钮&#xff0c;设置为只为 设置行或者列的只读属性&#xff0c;可以设置整行或者整列只读 2、设置单元格编辑控件为标签控件(标签控件不可编辑) 3、通过锁定行&#xff0c;锁定行的修改。锁定的行与只读行的区别在于锁定的行不…

【已解决】mac端 sourceTree 解决remote: HTTP Basic: Access denied报错

又是在一次使用sourcetree拉取或者提交代码时候&#xff0c;遇到了sourcetree报错&#xff1b; 排查了一会&#xff0c;比如查看了SSH keys是否有问题、是否与sourcetree账户状态有问题等等&#xff0c;最终才发现并解决问题 原因&#xff1a; 因为之前公司要求企业gitlab中…