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

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

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

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 {
    @Resource
    private 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.效果图

 6. github代码地址

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

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值