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

java spring boot 单/多文件上传/下载

文章目录

  • 使用版本
  • 文件上传
    • 服务端
    • 客户端(前端)
      • 方式一
      • 方式二
  • 文件下载
    • 服务端
    • 客户端(前端)
  • 代码仓库地址

使用版本

后端

  • spring-boot 3.3.0
  • jdk17

前端

  • vue “^3.3.11”
  • vite “^5.0.8”
  • axios “^1.7.2”

文件上传

上传文件比较简单。一般前端传文件流(二进制)到后端,后端处理文件流保存到目标位置即可!

服务端

MultipartFile是SpringMVC提供简化上传操作的工具类。
主要是使用 MultipartFile 的 transferTo 方法。

这里使用了MultipartFile[] 表示支持多文件上传

@PostMapping(path = {"/upload"})
public void getMs(@RequestPart("file") MultipartFile[] files) throws IOException {for (MultipartFile file : files){String fileName = file.getOriginalFilename();File dest = new File("/Users/cyq/Downloads/" + fileName);file.transferTo(dest);}
}

客户端(前端)

方式一

使用原生上传

需要注意的是

  • 用formData去保存文件信息,
  • 设置类型’Content-Type’: ‘multipart/form-data’

formData可以存储二进制文件、blob等类型,

<script setup>
import { ref } from 'vue'
import axios from 'axios'function sendRequest(file) {const formData = new FormData();formData.append('file', file[0]);formData.append('file', file[1]);axios.post('/api/ceel/hi', formData,{headers: {'Content-Type': 'multipart/form-data'}}).then(function (response) {console.log(response);}).catch(function (error) {console.log(error);});
}function getFile(event){const files =  event.target.filesconsole.log(files);sendRequest(files)
}
</script><template><input v-on:change="getFile" multiple="multiple" type="file" />
</template>

方式二

就很简单了,直接使用elment-plus的上传组件。
使用这种方式多文件上传时- 其实是一个一个的上传的。并不是一下子上传。

<script setup>
import { ref } from 'vue'
const fileList = ref([])
</script><template>
<el-upload multipleaction="/api/ceel/hi"v-model:file-list="fileList"
><el-button type="primary">上传文件</el-button>
</el-upload>
</template>

文件下载

下载文件一般都是处理文件流。
通常使用一个byte数组(字节数组)来存放文件流中的数据,每次存取byte数组的长度个数据。然后放到输出流中。
重复以上动作,直到文件流处理完成!

就像是个搬运工,每次搬运指定字节的数据,从输入流到输出流直到搬完。

服务端

@GetMapping("/download")
public void download(String fileName, HttpServletResponse response) throws IOException {String _u = "/Users/cyq/Downloads/";String filePath = _u + fileName + ".xlsx";File file = new File(filePath);response.setContentType("application/octet-stream");// 告知浏览器文件大小response.addHeader("Content-Length", "" + file.length()); response.setHeader("content-disposition","attachment;fileName="+ URLEncoder.encode(file.getName(), "UTF-8"));FileInputStream inputStream = new FileInputStream(file);ServletOutputStream outputStream = response.getOutputStream();try (inputStream; outputStream){byte[] buffer = new byte[1024];int len;while ((len = inputStream.read(buffer)) > 0){outputStream.write(buffer, 0, len);}}
}

客户端(前端)

发起请求,需要明确返回数据的类型是 blob,添加responseType: ‘blob’
拿到返回流后,通过URL.createObjectURL处理文件流,生成一个url,供a标签进行下载!
下载完成后需要移除。

function sendRequest() {axios.get('/api/ceel/download?fileName=模板-财源系统', {responseType: 'blob'}).then(function (response) {const url = window.URL.createObjectURL(new Blob([response.data]));const link = document.createElement('a');link.href = url;link.setAttribute('download', '模板-财源系统.xlsx');document.body.appendChild(link);link.click();document.body.removeChild(link);}).catch(function (error) {console.log(error);});
}

代码仓库地址

  • 后端代码 https://github.com/Mrceel/java-demo.git

路径为

package com.example.practicejava.file;
http://www.lryc.cn/news/383403.html

相关文章:

  • C语言的内存函数
  • 【网络通信】计算机网络安全技术总结
  • Redis-实战篇-什么是缓存-添加redis缓存
  • 《妃梦千年》第十一章:再遇故人
  • 反序列化底层学习
  • 项目训练营第五天
  • 数据收集和数据分析
  • Kubernetes(K8s)从入门到精通系列之十九:Operator模式
  • vuex的actions返回结果类型是promise及actions方法互相调用
  • 【干货】Jupyter Lab操作文档
  • iOS分享到微信,配置Universal Links,并从微信打开app,跳转到指定界面
  • 基于SSM构建的校园失眠与压力管理系统的设计与实现【附源码】
  • SAP 初始化库存移动类型561501511区别简介
  • 情感搞笑聊天记录视频:AI自动化生成技术,操作简单,教程+软件
  • RabbitMQ中lazyqueue队列
  • Java三层框架的解析
  • 算法设计与分析 笔记
  • mapreduce的工作原理
  • vue中v-bind和v-model有什么区别
  • 基于SpringBoot和PostGIS的某国基地可视化实战
  • 为什么Linux服务器空间充足而实际上空间已满的原因
  • 【LC刷题】DAY16:530 501 236
  • Vue 3 的 Teleport 组件实现跨层级通信
  • chromadb
  • Gradle 自动化项目构建-Gradle 核心之 Project
  • 简单介绍 Kamailio cfg_rpc 模块
  • Windows 根据github上的环境需求,安装一个虚拟环境,安装cuda和torch
  • LeetCode 179. 最大数
  • 基于Java+SpringBoot+vue+elementui药品商城采购系统详细设计实现
  • Pikachu靶场--文件上传