SpringBoot+Vue实现简单的文件上传(策略模式)

SpringBoot+Vue实现简单的文件上传

1 环境 SpringBoot 3.2.1,Vue 2,ElementUI
2 问题 前两篇文章,我们上传了txt、Excel文件,其实文件类型有很多种,如果我们的upload组件没有上传文件类型的限制,那么同一个接口会上传多种文件,而类型不一样,其处理的方式也不一样。一种方式是写if判断,我们判断其类型,然后做特定的处理,那样代码会有大量if判断;另外一个可以使用策略模式来处理,简单来说就是定义一个接口,多个实现类,不同的文件类型使用不同的实现类。这里对策略模式不做详细的介绍,有兴趣的可以自行上网查阅。直接上代码。
接口

java 复制代码
public interface FileService {
    Result upload(MultipartFile file);
}

关于txt文件的处理类

java 复制代码
@Service("txt")
public class TextServiceImpl implements FileService {

    @Override
    public Result upload(@RequestParam("file") MultipartFile file) {
        if (file.isEmpty()) {
            return Result.builder().code(500).msg("上传失败!").build();
        }
        try (BufferedReader reader = new BufferedReader(new InputStreamReader(file.getInputStream()))) {
            String line;
            while ((line = reader.readLine()) != null) {
                // 在这里处理读取到的每一行内容
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return Result.builder().code(200).msg("上传成功").build();
    }
}

关于xls文件的处理

java 复制代码
@Service("xls")
public class XLSServiceImpl implements FileService {

    @Override
    public Result upload(MultipartFile file) {
        if (file.isEmpty()) {
            return Result.builder().code(500).msg("上传失败!").build();
        }


        try (Workbook workbook = new HSSFWorkbook(file.getInputStream())) {
            //获取第一个sheet页
            Sheet sheet = workbook.getSheetAt(0);
            //遍历每行
            for (Row row : sheet) {
                //遍历每个单元格
                for (Cell cell : row) {
                    System.out.print(cell.getStringCellValue() + " ");
                }
                System.out.println();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        return Result.builder().code(200).msg("上传成功").build();
    }
}

关于xlsx文件的处理

java 复制代码
@Service("xlsx")
public class XLSXServiceImpl implements FileService {

    @Override
    public Result upload(MultipartFile file) {
        if (file.isEmpty()) {
            return Result.builder().code(500).msg("上传失败!").build();
        }

        try (Workbook workbook = new XSSFWorkbook(file.getInputStream())) {
            //获取第一个sheet页
            Sheet sheet = workbook.getSheetAt(0);
            //遍历每行
            for (Row row : sheet) {
                //遍历每个单元格
                for (Cell cell : row) {
                    System.out.print(cell.getStringCellValue() + " ");
                }
                System.out.println();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        return Result.builder().code(200).msg("上传成功").build();
    }
}

入口

java 复制代码
@RestController
public class FileController {
    //处理实现类的集合,spring中,对于同一类bean不同的别名是可以注入到一个map中或者list中的
    //key为实现类的别名,value就是bean
    @Autowired
    private Map<String, FileService> fileServiceMap;

    @RequestMapping("/fileUpload")
    private Result fileUpload(@RequestParam("file") MultipartFile file) throws IOException {
        if (file.isEmpty()) {
            return Result.builder().code(500).msg("上传失败!").build();
        }
        String fileName = file.getOriginalFilename();
        //这里我们获取到后缀名,然后就可以在map中找到对应的实现类
        FileService fileService = fileServiceMap.get(getSuffix(fileName));
        if(fileService == null){
            return Result.builder().code(500).msg("没有合适的处理器处理上传的文件!").build();
        }
        fileService.upload(file);

        return Result.builder().code(200).msg("上传成功").build();
    }
    //获取文件的后缀名
    private static String getSuffix(String filePath) {
        int dotIndex = filePath.lastIndexOf('.');
        if (dotIndex > 0 && dotIndex < filePath.length() - 1) {
            return filePath.substring(dotIndex + 1);
        }
        return "";
    }
}

附:

1 @Service("txt")就是给实现类bean取个别名,然后方便我们后续通过文件的后缀名找到对应的实现类。

2 HSSF 和 XSSF 主要有以下区别:

HSSF 是用于操作 Excel 2003 及以前版本(.xls 文件)的类库。它基于二进制格式。

XSSF 则是用于操作 Excel 2007 及以后版本(.xlsx 文件)的类库,这些版本采用的是 Open XML 格式。XSSF 能够处理更大、更复杂的工作簿,并且在处理一些新特性和功能上更具优势。

相关推荐
HalvmånEver3 小时前
7.高并发内存池大页内存申请释放以及使用定长内存池脱离new
java·spring boot·spring
凤山老林3 小时前
SpringBoot 使用 H2 文本数据库构建轻量级应用
java·数据库·spring boot·后端
蓝莓味的口香糖4 小时前
【vue3】组件的批量全局注册
前端·javascript·vue.js
dreamread4 小时前
【SpringBoot整合系列】SpringBoot3.x整合Swagger
java·spring boot·后端
把你毕设抢过来4 小时前
基于Spring Boot的社区智慧养老监护管理平台(源码+文档)
数据库·spring boot·后端
独泪了无痕4 小时前
自动导入 AutoImport:告别手动引入依赖,优化Vue3开发体验
前端·vue.js·typescript
闻哥5 小时前
深入Redis的RDB和AOF两种持久化方式以及AOF重写机制的分析
java·数据库·spring boot·redis·spring·缓存·面试
毕设源码_廖学姐7 小时前
计算机毕业设计springboot古诗词学习App 基于SpringBoot的中华经典诗文数字化研习平台 SpringBoot框架下的传统诗词文化移动学习系统
spring boot·学习·课程设计
全栈小57 小时前
【前端】Vue 组件开发中的枚举值验证:从一个Type属性错误说起
前端·javascript·vue.js
꧁꫞꯭零꯭点꯭꫞꧂8 小时前
G6绘制机柜 以及机柜设备的demo
前端·javascript·vue.js