Springboot MultipartFile文件上传与下载

news2024/11/24 8:54:20

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


}

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

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

相关文章

Dynamics 365 视图

1 视图分类 如图,视图分为查找视图、关联视图、公共视图三类。其中查找视图又可分为查找视图、高级查找视图、快速查找视图。 查找视图从名称来看,就是查找记录使用的,相当于预置了一些过滤条件,且控制查询的结果展示的列。只不过使用的位置不同,具体如下。 公共视图是最…

实践-CNN卷积层

实践-CNN卷积层 1 卷积层构造2 整体流程3 BatchNormalization效果4 参数对比5 测试效果 1 卷积层构造 2 整体流程 根据网络结构来写就可以了。 池化 拉平 训练一个网络需要2-3天的时间。用经典网络来&#xff0c;一些细节没有必要去扣。 损失函数&#xff1a; fit模型&…

量子计算的突破:从理论到实践

章节一&#xff1a;引言 随着信息时代的到来&#xff0c;计算科学与技术也在不断迎来新的突破与革新。其中&#xff0c;量子计算作为一项引人瞩目的前沿技术&#xff0c;正逐渐从理论走向实践。量子计算以其在处理复杂问题上的巨大潜力&#xff0c;吸引着全球科学家和工程师的关…

需求调研前需要做哪些准备?

大家好&#xff0c;我是沐尘而生&#xff0c;今天让我和大家一起走进&#xff0c;产品经理实战百问百答&#xff0c;从问题入手&#xff0c;一步一个脚印&#xff0c;习惯产品经理岗位。 我将从需求调研的角度出发&#xff0c;为大家详细介绍一下在开始调研前需要做哪些准备工作…

项目难点:解决IOS调用起软键盘之后页面样式布局错乱问题

需求背景 &#xff1a; 开发了一个问卷系统重构项目&#xff0c;刚开始开发的为 PC 端&#xff0c;其中最头疼的一点无非就是 IE 浏览器的兼容适配性问题&#xff1b; 再之后项目经理要求开发移动端&#xff0c;简单的说就是写 H5 页面&#xff0c;到时候会内嵌在 App 应用或办…

嵌入式要卷成下一个Java了吗?

不会&#xff01; 说不会也是有自己的原因的 前几天写了一篇 Linux 和单片机的文章 不做Linux就没前途吗&#xff1f; 单片机容易&#xff0c;门槛低&#xff0c;无非不就是单片机技术知识点比较少&#xff0c;特别是面向过程式的编程也更容易掌握。嵌入式 Linux 是多任务式的&…

Rx.NET in Action 第四章学习笔记

Part 2 核心思想 《Rx.NET in Action》这一部共分八章&#xff0c;涵盖了Rx 关键模块——**Observable(可观察序列)和Observer(观察者)**的全部功能&#xff0c;以及如何创建它们、连接它们和控制它们之间的关系。 然后&#xff0c;您将学习如何使用强大的 Rx 处理器构建复杂…

小程序云开发配置访问公网链接--定位到具体街道地址

以获取定位地址为例&#xff1a; 一、和平常用postman、talend api tester、其他测试调用工具为比对&#xff1b; 现有一需求&#xff0c;需要定位当前地址&#xff0c; 具体详细文档&#xff1a;腾讯位置服务 参数准备工作&#xff1a; key&#xff1a;是在腾讯位置服务里面注…

使用路由器更改设备IP_跨网段连接PLC

在一些设备IP已经固定,但是需要采集此设备的数据,需要用到跨网段采集 1、将路由器WAN&#xff08;外网拨号口&#xff09;设置为静态IP 2、设置DMZ主机&#xff0c;把DMZ主机地址设置成跨网段的PLC地址 DMZ主机 基本信息. DMZ (Demilitarized Zone)即俗称的非军事区&#xff0…

【Unity造轮子】制作一个简单的2d抓勾效果(类似蜘蛛侠的技能)

前言 欢迎阅读本文&#xff0c;本文将向您介绍如何使用Unity游戏引擎来实现一个简单而有趣的2D抓勾效果&#xff0c;类似于蜘蛛侠的独特能力。抓勾效果是许多动作游戏和平台游戏中的常见元素&#xff0c;给玩家带来了无限的想象和挑战。 不需要担心&#xff0c;即使您是一…

服务器扩展未生效

服务器扩容未生效 在阿里云付费扩容后&#xff0c;在服务器里面看未生效。 阿里云->实例与镜像->实例->选择实例->云盘->扩容进入linux服务器查看&#xff1a; df -h vda1扩容未生效。原40g->扩容后100g 解决方法&#xff1a; 1、安装growpart yum inst…

chatgpt和xmind结合起来帮你制作精美的思维导图

介绍 chatgpt和xmind结合起来帮你制作精美的思维导图。 1.输出Markdown格式 2.xmind导入.md文件

自动驾驶技术:改变交通出行的未来

自动驾驶技术&#xff0c;这个让人充满期待的技术&#xff0c;正在改变我们的交通方式&#xff0c;带来一种全新的出行体验。它可以让汽车、无人机等交通工具像人类驾驶一样自主行驶&#xff0c;通过人工智能、视觉计算、雷达、监控装置和全球定位系统协同合作&#xff0c;实现…

Handler详解

跟Handler有关系的&#xff0c;包括Thread&#xff0c;Looper&#xff0c;Handler&#xff0c;MessageQueue Looper: 由于Looper是android包加入的类&#xff0c;而Thread是java包的类&#xff0c;所以&#xff0c;想要为Thread创建一个Looper&#xff0c;需要在线程内部调用…

ChatGPT能代替搜索引擎吗?ChatGPT和搜索引擎有什么区别?

ChatGPT和搜索引擎是两种在信息获取和交流中常用的工具&#xff0c;ChatGPT是一种基于人工智能技术的聊天机器人&#xff0c;而搜索引擎是一种在互联网上搜索信息的工具。尽管它们都是依托互联网与信息获取和交流有关&#xff0c;部分功能重合&#xff0c;但在很多方面存在着明…

名侦探番外——Arduino“炸弹”引爆摩天大楼

名侦探番外——Arduino“炸弹”引爆摩天大楼 硬件准备1.材料准备2.模块介绍 电路设计1.硬件接线 程序设计1.设计思路2.部分程序3.功能优化 总结 好久不见&#xff0c;童鞋们&#xff01;小编突然想到很久以前看的柯南剧场版——计时引爆摩天大楼的情景&#xff0c;对剧里的“炸…

TEXTure环境配置,跑通inference的demo

TEXTure 环境配置安装kaolin这个包,这里可能会遇到各种问题配置huggingface的访问令牌 运行Text Conditioned Texture Generation指令报错1报错2成功运行 查看结果查看贴图后的三维网格模型 环境配置 # 创建一个名为texture的环境 conda create -n texture python3.9 -y# 激活…

【算法——双指针】LeetCode 202 快乐数

题目描述&#xff1a; 思路&#xff1a;快慢指针 看到循环&#xff0c;我就想起了快慢指针的方法&#xff0c;从题目我们可以看出&#xff0c;我们需要模拟一个过程&#xff1a;不断用当前的数去生成下一个数&#xff0c;生成的规则就是将当前数的各位的平方累加&#xff1b; …

微信小程序(原生)搜索功能实现

一、效果图 二、代码 wxml <van-searchvalue"{{ keyword }}"shape"round"background"#000"placeholder"请输入关键词"use-action-slotbind:change"onChange"bind:search"onSearch"bind:clear"onClear&q…

Python——添加照片边框

原图&#xff1a; 添加边框后&#xff1a; 添加边框会读取照片的exif信息如时间、相机型号、品牌以及快门焦段等信息&#xff0c;将他们显示在下面的边框中。 获取当前py文件路径 import os #get path that py file located def Get_Currentpath():file_path os.path.abspa…