java文件夹上传,保留文件夹结构

news/2025/3/14 16:39:54/

需求: 产品要求可以上传文件夹,文件夹下包含其他文件夹

前端上传文件夹,可以把文件以及所在文件所在文件夹信息传到后端

1.前端设置

需要设置 webkitdirectory enctype = multipart/form-data

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>文件夹上传</title>
</head>
<body>
<form action="/file/folderUpload" method="post" enctype="multipart/form-data"><input type="file" name="multipartFiles" multiple webkitdirectory><button type="submit">上传</button>
</form>
</body>
</html>

2.后端代码

service impl 代码

import cn.hutool.core.util.StrUtil;
import com.example.folder.upload.entity.TreeNodeDTO;
import com.example.folder.upload.service.FileService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;@Slf4j
@Service
public class FileServiceImpl implements FileService {/*** 文件夹上传** @param files*/public List<TreeNodeDTO> folderUpload(MultipartFile[] files) {List<TreeNodeDTO> treeNodeDTOList = new ArrayList<>();if (files == null || files.length == 0) {return new ArrayList<>();}String firstFolder = null;for (MultipartFile file : files) {TreeNodeDTO treeNodeDTO = new TreeNodeDTO();String filePath = file.getOriginalFilename();if (filePath.lastIndexOf(StrUtil.C_SLASH) > 0) {String dirPath = file.getOriginalFilename().substring(0, file.getOriginalFilename().lastIndexOf(StrUtil.C_SLASH));// 设置文件所在目录的全目录路径treeNodeDTO.setFolderFullName(dirPath);String[] split = dirPath.split(StrUtil.SLASH);if (split != null) {String folder = split[split.length - 1];// 文件所在当前目录名称treeNodeDTO.setFolderName(folder);}if (firstFolder == null) {firstFolder = split[0];}}int index = filePath.lastIndexOf(StrUtil.C_SLASH);String fileName = filePath.substring(index + 1);// 文件名称treeNodeDTO.setName(fileName);treeNodeDTOList.add(treeNodeDTO);}// 判断是否存在一级目录List<String> fullFolderList = treeNodeDTOList.stream().map(TreeNodeDTO::getFolderFullName).collect(Collectors.toList());if (firstFolder != null && !fullFolderList.contains(firstFolder)) {TreeNodeDTO treeNodeDTO = new TreeNodeDTO();treeNodeDTO.setFolderName(firstFolder);treeNodeDTO.setFolderFullName(firstFolder);treeNodeDTOList.add(treeNodeDTO);}treeNodeDTOList.forEach(treeNodeDTO -> {log.info("文件名:{},目录全路径:{},当前目录:{}",treeNodeDTO.getName(),treeNodeDTO.getFolderFullName(),treeNodeDTO.getFolderName());});return treeNodeDTOList;}}

service 代码

import com.example.folder.upload.entity.TreeNodeDTO;
import org.springframework.web.multipart.MultipartFile;import java.util.List;public interface FileService {/*** 文件夹上传* @param files*/List<TreeNodeDTO> folderUpload(MultipartFile[] files);
}

3.controller

import com.example.folder.upload.entity.TreeNodeDTO;
import com.example.folder.upload.service.FileService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import javax.annotation.Resource;
import java.util.List;@RestController
@RequestMapping("/file")
public class FileController {@Resourceprivate FileService fileService;@RequestMapping(value = "/folderUpload", method = RequestMethod.POST)public List<TreeNodeDTO> uploadFolder(MultipartFile[] multipartFiles) {return fileService.folderUpload(multipartFiles);}
}

4. treeNodeDTO 

import lombok.Data;@Data
public class TreeNodeDTO {/*** 文件名*/private String name;/*** 最后一级文件夹名称*/private String folderName;/*** 全路径文件夹*/private String folderFullName;
}

5. github代码地址

GitHub - katriina-tavi/folder-upload: 文件夹上传


http://www.ppmy.cn/news/710091.html

相关文章

Spring Boot 中的 CD 工具

Spring Boot 中的 CD 工具 在现代软件开发中&#xff0c;持续交付&#xff08;Continuous Delivery&#xff0c;简称 CD&#xff09;已经成为了一个非常重要的开发模式。CD 工具可以帮助我们自动化构建、测试、部署和发布软件&#xff0c;提高软件交付的速度和质量。在 Spring…

大数据分析案例-基于LightGBM算法构建公司破产预测模型

🤵‍♂️ 个人主页:@艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏 📂加关注+ 喜欢大数据分析项目的小伙伴,希望可以多多支持该系列的其他文章 大数据分析案例合集…

v67.03 鸿蒙内核源码分析(字符设备) | 绝大多数设备都是这类 | 百篇博客分析OpenHarmony源码

曾子曰:“君子以文会友,以友辅仁。” 《论语》:颜渊篇 百篇博客系列篇.本篇为: v67.xx 鸿蒙内核源码分析(字符设备篇) | 绝大多数设备都是这类 文件系统相关篇为: v62.02 鸿蒙内核源码分析(文件概念) | 为什么说一切皆是文件v63.04 鸿蒙内核源码分析(文件系统) | 用图书管…

计算机和美术之间有什么联系,你和绘画大师之间,或许就差这样一款给力的平板电脑...

以往对于很多人来说&#xff0c;平板电脑只算作一个玩具&#xff0c;日常更多被用来刷剧和玩游戏。而近几年&#xff0c;重量级绘画App和压感画笔的技术突破&#xff0c;使平板电脑在绘画方面的生产力属性逐年递增。身边做设计的朋友和微博里关注的绘画大触纷纷开始用平板来进行…

Linux系列镜像下载_wentfar·tsao

Linux镜像下载 方法一&#xff1a; Linux系统下载网站&#xff08;只有CentOS和Ubuntu&#xff09; https://man.linuxde.net/download/ 使用迅雷或者其他磁力下载工具即可下载 推荐使用闪电下载软件&#xff0c;速度比无会员的迅雷快。 详情见https://blog.csdn.net/weixin…

这款 Github 全能下载工具,很强!

点击“开发者技术前线”&#xff0c;选择“星标????” 在看|星标|留言, 真爱 来自&#xff1a;iGithub中文社区 大家好&#xff0c;我是hub哥 大家下载资源是不是还在用某度&#xff0c;或者X雷呢&#xff0c;对于一个技术人&#xff0c;当然得逼格更高一点&#xff0c;更…

3款别出心裁的电脑软件,个个精选,让你眼前一亮

对于很多人来讲&#xff0c;好的软件&#xff0c;可以让我们心情愉悦一整天。 笔者今天&#xff0c;推出3款私藏已久的神器软件&#xff0c;希望在这个炎炎夏日&#xff0c;给大家带来一丝清凉。 Honeyview Honeyview&#xff0c;是一款轻量级的图像浏览器。 Honeyview 软件…

【报告分享】2022年快手新市井商业内循环营销通案:让企业经营走向确定性增长.pdf(附下载链接)...

省时查报告-专业、及时、全面的行研报告库 省时查方案-专业、及时、全面的营销策划方案库 【免费下载】2022年1月份热门报告盘点 【报告分享】2021-2022元宇宙报告.pdf 2022年私域运营机会及创业趋势.pdf 2022抖音电商新品牌成长报告.pdf 大家好&#xff0c;我是文文&#xff0…