SpringMvc文件上传下载案例

news2024/9/24 19:14:46

1、文件上传

文件上传功能如下:

客户端使用ElementPlus上传文件

服务器使用 SpringMvc接收文件

1.1客户端代码

ElementPlus的<el-upload>可以非常方便的处理文件上传功能,即美观又强大。

传送门--》 upload组件文档

1.1.1、使用axios工具上传文件

<el-upload>默认是使用 XMLHttpRequest方式上传文件的,如果需要使用axios工具,有两种方式。

第一种:覆盖<el-upload>默认的 http-request行为

通过修改<el-upload>的http-request参数,允许自行实现上传文件的请求

<div >
        <el-upload
          ref="upload"
          action="/question/upload"
          :limit="1"
          :http-request="handleChange"
          accept=".xls,.xlsx"
          :auto-upload="true"
        >
        <template #trigger>
          <el-button type="primary">select file</el-button>
          </template>
        </el-upload>
 
</div>

上传函数

    handleChange(request) {
      // 这里的file是el-upload传递的文件对象
      // 参数示例: {"headers":{},"withCredentials":false,"file":        
      // {"uid":1713089255886},"data": 
      // {},"method":"post","filename":"file","action":"/file/upload"}
      
      const formData = new FormData();
      formData.append('file', request.file);
      axios.post('/file/upload', formData, {
        headers: {
          'Content-Type': 'multipart/form-data'
        }
      })
      .then(response => {
        // 处理响应
        console.log(response.data);
      })
      .catch(error => {
        // 处理错误
        console.error(error);
      });
    }

第二种:监听<el-upload>的on-change事件,自行实现上传文件的请求

<div style="float:left;padding-top:50px;">
  <el-upload
    ref="upload"
    action="/file/upload"
    :limit="1"
    :on-change="handleChange"
    accept=".xls,.xlsx"
    :auto-upload="false"
  >
  <template #trigger>
      <el-button type="primary">select file</el-button>
    </template>
  </el-upload>

</div>

上传函数

    handleChange(file) {
      // 这里的file是el-upload传递的文件对象
      const formData = new FormData();
      formData.append('file', file.raw);
      axios.post('/file/upload', formData, {
        headers: {
          'Content-Type': 'multipart/form-data'
        }
      })
      .then(response => {
        // 处理响应
        console.log(response.data);
      })
      .catch(error => {
        // 处理错误
        console.error(error);
      });

1.2、服务端代码

SpringMvc处理文件上传非常方便

    @PostMapping("/file/upload")
    public Response questionUploadAndReadExcel(@RequestParam("file") MultipartFile file) {
          // do sth with file
          return Response.success("ok");
      
    }

2、文件下载

2.1、客户端代码

使用<el-table>标签展示可供下载的文件列表

ElementPlus的<el-table>可以非常方便的展示文件列表,即美观又强大。

传送门--》table组件

 使用<el-table>展示数据

      <el-table class="down" :data="fileList" border stripe style="width: 100%;margin-top: 20px;">
            <el-table-column prop="name" label="文件名称"></el-table-column>
            <el-table-column prop="attachSize" label="文件大小">
             <template #default="scope">
                  <span v-if="scope.row.attachSize / 1024 / 1024 < 1">{{(scope.row.attachSize / 1024).toFixed(2) + 'KB'}}</span>
                  <span v-else>{{(scope.row.attachSize / 1024 / 1024).toFixed(2) + 'MB'}}</span>
              </template>
            </el-table-column>
      
            <el-table-column width="150px" label="操作">
                 <template #default="scope">
                    <el-button size="small" type="text">
                        <a @click="downloadFile(scope.row.name)" download="scope.row.name">下载</a>
                    </el-button>
                    <el-button size="small" type="text" @click="deleteHandle(scope.row.id)">删除</el-button>
                </template>
            </el-table-column>
        </el-table>

下载函数

点击超链接之后,动态构建<a>标签,并模拟点击。一个正确的url地址是类似这样的

http://127.0.0.1:5173/api/file/download/hello.xml
    downloadFile(name) {
      // 动态构建<a>标签,并模拟点击
      var url = '/file/download/'+name;
      const a = document.createElement('a')
      a.setAttribute('download', name)
      a.setAttribute('target', '_blank')
      a.setAttribute('href', url)
      document.body.appendChild(a);
      a.click()
    }

2.2、服务端代码

服务端使用SpringMVC提供文件下载,代码比较简单。

@Controller
@RequestMapping("/file")
public class FileController {

    String filePath = "E:\\demo";

    @RequestMapping("/download/{fileName}")
    public ResponseEntity<ByteArrayResource> downloadFile(@PathVariable("fileName") String fileName) throws IOException {
        // 读取文件内容,并将其转换为ByteArrayResource对象
        File file = new File(filePath + File.separator + fileName);
        byte[] fileContent = Files.readAllBytes(file.toPath());
        ByteArrayResource resource = new ByteArrayResource(fileContent);

        // 设置响应头,告诉浏览器文件的类型和下载方式
        HttpHeaders headers = new HttpHeaders();
        headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + file.getName());

        // 返回包含文件内容的ResponseEntity对象
        return ResponseEntity.ok()
                .headers(headers)
                .contentLength(fileContent.length)
                .contentType(MediaType.APPLICATION_OCTET_STREAM)
                .body(resource);
    }
}

需要注意的是,这样要选择@Controller注解,而不是@RestController注解。

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

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

相关文章

Java算法之时间复杂度和空间复杂度的概念和计算

1. 算法效率 如何去衡量一个算法的好坏&#xff1f; 通常我们从时间效率和空间效率两个方面去分析算法的好坏。时间效率即时间复杂度&#xff0c;空间效率被称为空间复杂度。时间复杂度主要是衡量一个算法的运行速度&#xff0c;而空间复杂度主要衡量一个算法所需要的额外空间…

【面试题】s += 1 和 s = s + 1的区别

文章目录 1.问题2.发现过程3.解析 1.问题 以下两个程序真的完全等同吗&#xff1f; short s 0; s 1; short s 0; s s 1; 2.发现过程 初看s 1 和 s s 1好像是等价的&#xff0c;没有什么区别。很长一段时间内我也是这么觉得&#xff0c;因为当时学习c语言的时候教科书…

系统思考—时间滞延

“没有足够的时间是所有管理问题的一部分。”——彼得德鲁克 鱼和熊掌可以兼得&#xff0c;但并不能同时获得。在提出系统解决方案时&#xff0c;我们必须认识到并考虑到解决方案的实施通常会有必要的时间滞延。这种延迟有时比我们预想的要长得多&#xff0c;特别是当方案涉及…

AlgorithmDay11

day11 对于-*/这些运算符&#xff0c;它们并不是单个字符&#xff0c;而是由两个字符组成的运算符。在C中&#xff0c;这些运算符是作为字符串处理的&#xff0c;因此应该使用双引号来表示。 例如&#xff1a; string op ""; // 表示加法运算符另一方面&#xff…

vue3+高德地图(或echarts)+turfjs实现等压线,色斑图(用于显示气象,环境等地图场景)

首先是turf.js(英文官网),也有中文网不过也就目录翻译了一下. 高德官网自行获得key echarts官网 使用turf的isobands api实现. 数据: 需要准备geojson格式经纬度信息业务值(比如温度,高度,光照只要是number值什么数据都可以) 国内各地区geojson数据点这里获得 参考的是这位大佬…

30元腾讯云服务器搭建幻兽帕鲁Palworld多人联机游戏,畅玩

幻兽帕鲁太火了&#xff0c;官方palworld服务器不稳定&#xff1f;不如自建服务器&#xff0c;基于腾讯云幻兽帕鲁服务器成本32元全自动部署幻兽帕鲁服务器&#xff0c;超简单有手就行&#xff0c;全程自动化一键部署10秒钟即可搞定&#xff0c;无需玩家手动部署幻兽帕鲁游戏程…

[通俗易懂:Linux标准输入/输出和重定向]Shell脚本之 > /dev/null 2>1命令详解

目录标题 一、> /dev/null 2>&1 命令解析二、/dev/null 文件浅显理解三、标准输入、标准输出、标准错误输出四、输入重定向、输出重定向五、命令作用与应用场景 如果想看命令意义&#xff0c;可以直接跳到第五部分 一、> /dev/null 2>&1 命令解析 我们在别…

7 个 Python 问题,来扫扫盲

这 7 个问题&#xff0c;我是有收获的&#xff0c;整理如下&#xff1a; 1、反射算术运算符 你可能知道 Python 里面的魔法函数&#xff0c;比如 __add__ 和 __sub__ 代表 - 运算符&#xff0c;表示 obj /- something&#xff0c;但你可能不知道还有一个 __radd__&#xff0…

JMeter入门教程 —— 事务!

简介&#xff1a; JMeter中事务的基本介绍 1.任务背景 JMeter中的事务是通过事务控制器实现的。&#xff0c;为了衡量服务器对某一个或一系列操作处理的响应时间&#xff0c;需要定义事务。下面我们详细介绍在JMeter中如何使用事务 2.任务目标 掌握基于JMeter性能测试脚本开…

标准版uni-app移动端页面添加/开发操作流程

页面简介 uni-app项目中&#xff0c;一个页面就是一个符合Vue SFC规范的.vue文件或.nvue文件。 .vue页面和.nvue页面&#xff0c;均全平台支持&#xff0c;差异在于当uni-app发行到App平台时&#xff0c;.vue文件会使用webview进行渲染&#xff0c;.nvue会使用原生进行渲染。…

若依框架针对漏洞升级的记录

背景&#xff1a;项目部署在生产环境上以后&#xff0c;漏洞扫描的时候&#xff0c;发现各种漏洞需要修复&#xff0c;很多漏洞的升级后面都记不住了&#xff0c;所以现在都简单记录一下处理的步骤 20240415 解决方案&#xff1a;直接修改配置文件中的Spring security的版本…

bugku-web-需要管理员

页面源码 <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetUTF-8"> <title>404 Not Found</title> </head> <body> <div idmain><i> <h2>Something error:</h2…

Linux:调试器 - gdb

Linux&#xff1a;调试器 - gdb gbd基本概念gbd调试浏览断点运行变量 gbd基本概念 GDB (GNU Debugger) 是一个强大的命令行调试工具,用于调试各种编程语言(如C、C、Java、Python等)编写的程序。使用 gdb可以帮助开发人员更快地定位和修复程序中的缺陷,提高代码质量和开发效率。…

大众日报教育版的 投稿方式-最快一周内见报

大众日报教育版的 投稿方式-最快一周内见报 大众日报是中共山东省委机关报&#xff0c;创刊于1939年1月1日&#xff0c;由中国共产党领导下的八路军budui所创建&#xff0c;是中共在山东省发行的报纸。 大众日报的“大众教育”版块是该报的一个重要组成部分&#xff0c;主要关…

React-项目构建

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;React篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来React篇专栏内容:React-项目构建 目录 1、初始化项目 2、目录结构 组件 1、组件的创建方式 1.1、函数创建组…

【报错解决】RuntimeError: Distributed package doesn‘t have NCCL built in

报错信息&#xff1a; raise RuntimeError("Distributed package doesnt have NCCL " "built in") RuntimeError: Distributed package doesnt have NCCL built in报错原因&#xff1a; windows系统不支持nccl&#xff0c;采用gloo&#xff1b; 报错解决&…

浅谈程序员如何搞副业?

当程序员想要开展副业时&#xff0c;可以考虑以下具体的方法和策略&#xff1a; 确定自己的技术专长&#xff1a;了解自己在哪些技术领域有深入的专业知识和经验&#xff0c;根据这些领域找到适合的副业方向。 建立个人品牌和网络影响力&#xff1a;通过撰写博客、发表技术文章…

手拉手安装启动Kafka2.13

启动Kafka本地环境需Java 8以上 Kafka是一种高吞吐量的分布式发布订阅消息系统&#xff0c;它可以处理消费者在网站中的所有动作流数据。 这种动作&#xff08;网页浏览&#xff0c;搜索和其他用户的行动&#xff09;是在现代网络上的许多社会功能的一个关键因素。 Kafka启动…

云原生:企业数字化转型的引擎与未来

一&#xff0c;引言 随着信息技术的飞速发展&#xff0c;企业数字化转型已成为时代的必然趋势。在这场深刻的变革中&#xff0c;云原生技术以其独特的优势&#xff0c;逐渐成为推动企业数字化转型的核心动力。本文将详细探讨云原生技术的内涵、发展历程&#xff0c;以及在企业数…

Flink入门学习 | 大数据技术

⭐简单说两句⭐ ✨ 正在努力的小新~ &#x1f496; 超级爱分享&#xff0c;分享各种有趣干货&#xff01; &#x1f469;‍&#x1f4bb; 提供&#xff1a;模拟面试 | 简历诊断 | 独家简历模板 &#x1f308; 感谢关注&#xff0c;关注了你就是我的超级粉丝啦&#xff01; &…