SpringBoot上传文件夹

embedded/2024/10/20 20:47:45/

SpringBoot上传文件夹

SpringBoot上传文件夹

  • SpringBoot上传文件夹
    • 前言
    • 前端
    • 后端
      • FileController
      • FilesUtil

前言

个人开发过程中的经验总结

前端

此处以vue3为例

<template><form @submit.prevent="uploadFiles" ref="form"><inputtype="file"name="folder"ref="folderInput"multiplewebkitdirectory/><button type="submit">上传</button></form>
</template><script setup>javascript">
import { ref } from "vue";const folderInput = ref(null);
const form = ref(null);const uploadFiles = () => {const formData = new FormData(form.value);// 发送数据到服务器fetch("http://localhost:8080/file/uploadFolder", {method: "POST",body: formData,}).then((response) => {if (!response.ok) {throw new Error("上传失败");}return response.json(); // 如果服务器返回JSON格式的响应,可以解析为JSON}).then((data) => {// 处理成功的响应,可以根据需要更新UI或执行其他操作console.log("上传成功:", data);}).catch((error) => {// 处理错误console.error("上传失败:", error);});
};
</script>

后端

FileController

java">@RestController
@RequestMapping("/file/")
@CrossOrigin
public class FileController {@PostMapping("/uploadFolder")public Result uploadFolder(MultipartFile[] folder) {// 指定存放目录boolean b = FilesUtil.saveFiles("D:/upload", folder);if (b)return ResultUtil.success("上传成功");elsereturn ResultUtil.error("有至少一个文件上传失败");}
}

FilesUtil

java">public class FilesUtil {public static boolean saveFiles(String savePath, MultipartFile[] files) {// 检查文件数组是否为空或长度为0,如果是则直接返回falseif (files == null || files.length == 0) {return false;}// 如果savePath以"/"结尾,去掉末尾的"/"if (savePath.endsWith("/")) {savePath = savePath.substring(0, savePath.length() - 1);}boolean allFilesSaved = true; // 用于记录所有文件是否都保存成功// 遍历文件数组,保存每个文件for (MultipartFile file : files) {// 构建文件的完整路径String filePath = savePath + "/" + file.getOriginalFilename();// 确保目录存在,不存在则创建makeDir(filePath);// 创建文件对象并保存文件File dest = new File(filePath);try {file.transferTo(dest);} catch (IllegalStateException | IOException e) {// 记录异常信息,可以考虑使用日志框架System.err.println("Failed to save file: " + file.getOriginalFilename());e.printStackTrace();allFilesSaved = false; // 标记为有文件保存失败}}return allFilesSaved; // 返回是否所有文件都保存成功}private static void makeDir(String filePath) {// 如果filePath中含有"/",则获取目录路径int lastIndex = filePath.lastIndexOf('/');if (lastIndex > 0) {String dirPath = filePath.substring(0, lastIndex);File dir = new File(dirPath);// 如果目录不存在,则创建目录if (!dir.exists() && !dir.mkdirs()) {System.err.println("Failed to create directory: " + dirPath);}}}
}

http://www.ppmy.cn/embedded/13982.html

相关文章

arping命令详解

arping – send ARP REQUEST to a neighbour host. arping 是一个在网络中发送 ARP 请求以查找特定 IP 地址对应的 MAC 地址的命令行工具。它的功能类似于 ping 命令&#xff0c;基于ARP协议报文的交互机制&#xff0c;只能测试同一网段或子网的网络主机的连通性。 ARP 是 Add…

Python 数据结构和算法实用指南(三)

原文&#xff1a;zh.annas-archive.org/md5/66ae3d5970b9b38c5ad770b42fec806d 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第七章&#xff1a;哈希和符号表 我们之前已经看过数组和列表&#xff0c;其中项目按顺序存储并通过索引号访问。索引号对计算机来说很有效…

简述MASM宏汇编

Hello , 我是小恒不会java。今天写写x86相关底层的东西 寄存器 8086由BIU和EU组成 8088/8086寄存器有14个。8通用&#xff0c;4段&#xff0c;1指针&#xff0c;1标志 8个通用寄存器&#xff1a;这些寄存器可以用来存储任意类型的数据&#xff0c;包括整数、地址等。8086有8个…

【C++风云录】解析医学影像处理工具:深入探讨ITK、OpenIGTLink、VTK、DCMTK、GDCM和NIfTI的应用和技术

医学影像处理工具&#xff1a;探索ITK、OpenIGTLink、VTK、DCMTK、GDCM和NIfTI 前言 医学影像处理在现代医学中起着至关重要的作用。随着医学技术的不断进步&#xff0c;出现了许多强大的开源工具和库&#xff0c;用于帮助医学影像处理专业人员处理、分析和可视化复杂的医学影…

屏幕状态自动检测+鼠标自动操作

目录 一、写在前面 1.1适用场景 1.2涉及到的库 二、函数库 2.1pyautogui-屏幕截图&鼠标操作 2.1.1屏幕截图screenshot函数 2.1.2鼠标移动及单击 2.2Opencv-模板匹配 2.2.1matchTemplate函数 2.2.2minMaxLoc函数 2.2.3相关代码 2.3base64-图片转base64 2.3.1在线…

学习记录694@java 多个文件zip压缩后下载

实际应用中需要下载多个文件&#xff0c;这个时候最好将这些文件打包成zip&#xff0c;然后再下载。其实非常的简单&#xff0c;只要借助hutool包即可&#xff0c;另外需要对基本的输入输出流了解。 代码 以下代码的基本逻辑是&#xff0c;或者要压缩打包的文件的输入流&…

SOCKS5代理(源码)

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 SOCKS5是个代理服务器协议。 我…

pollLast() 和poll啥区别

在 Java 中&#xff0c;pollLast() 和 poll() 是 Deque 接口的两个不同的方法&#xff0c;它们都用于从双端队列中移除并返回元素&#xff0c;但它们移除元素的位置不同&#xff1a; poll(): poll() 方法从双端队列的前端移除并返回第一个元素&#xff08;即队列的头部&#xf…