dataList = new ArrayList ();for (User user : dbData) {List row = new ArrayList ();row.add(user.getId());row.add(user.getN。有了这个开源工具后,我五点就下班了( 三 )。" />

有了这个开源工具后,我五点就下班了( 三 )

head = Stream.of("id", "name", "password").collect(Collectors.toList());List> dataList = new ArrayList<>();for (User user : dbData) {List row = new ArrayList<>();row.add(user.getId());row.add(user.getName());row.add(user.getPassword());dataList.add(row);}CsvExportUtil.exportCsvWithString(response, "demo", head, dataList);} /*** 导入用户数据案例(csv模式)** @param file*/@Transactional(rollbackFor = Exception.class)public void uploadUserListWithCsv(MultipartFile file) throws Exception {// 此处先校验导入的文件类型是否为csvString type = FileTypeUtil.getType(file.getInputStream());if (StrUtil.isBlank(type) || type.contains(ImportConstant.CSV_TYPE)) {// 返回校验失败信息return;}User user = new User();user.setId(100);user.setName("外层");user.setPassword("外层");userService.save(user);List errorLogList = new ArrayList<>();// 调用统一导入方法// 方式一:使用csv数据映射到dto实体的方式进行数据导入//CsvImportUtil.importCsvWithBean(file.getInputStream(), errorLogList, UserCsvDto.class, UserServiceImpl::saveUserListWithCsv);// 方式二、使用csv数据映射到字符串数组的方式进行数据导入CsvImportUtil.importCsvWithString(file.getInputStream(), errorLogList, UserCsvDto.class, UserServiceImpl::saveUserListWithCsvStringArrDemo);// 如果存在解析异常,输出解析异常并进行事务回滚if (CollUtil.isNotEmpty(errorLogList)) {throw new RuntimeException(StrUtil.toString(errorLogList));}}三、ftp工具  Ftp文件上传下载相比excel、csv等出现的场景较少,「但是,如果你参与的项目是政府或者涉及到第三方旧系统对接的时候,很多时候就需要使用到它 。因为很多旧系统或者政府项目使用的技术比较旧或者有制度限制,一般都是以文件的形式与你进行交互,此时ftp工具就很有效了 。」
  Ftp工具使用的commons.NET开源框架进行实现,具体的集成流程之前单独使用一篇文章进行了非常详细的介绍,有需要的读者可以点击后面链接查看:手把手教你搭建ftp服务器,并用程序完成ftp上传下载功能
  「部分源码如下:」
/*** 上传** @return*/public boolean upload(FtpUploadParam param) {boolean flag = false;FTPClient ftpClient = new FTPClient();//1 测试连接if (connect(ftpClient, param.getHostname(), param.getPort(), param.getUsername(), param.getPassword())) {try {//2 检查工作目录是否存在,不存在则创建if (!ftpClient.changeWorkingDirectory(param.getWorkingPath())) {ftpClient.makeDirectory(param.getWorkingPath());}// 将文件编码成Ftp服务器支持的编码类型(FTP协议里面,规定文件名编码为iso-8859-1,所以目录名或文件名需要转码 。)String fileName = new String(param.getSaveName().getBytes(ftpClientCharset), ftpServerCharset);// 3 上传文件if (ftpClient.storeFile(fileName, param.getInputStream())) {flag = true;} else {log.warn("FtpUtils uploadFile unsuccessfully!!");}} catch (IOException e) {log.error("FtpUtils upload in error:{}", e);} finally {disconnect(ftpClient);}}return flag;}/*** @description: 下载ftp文件* @param:* @param: param* @param: downloadFileName* @return:* @date: 2022/7/14 10:56*/public boolean download(FtpDownloadParam param, String downloadFileName) {FTPClient ftpClient = new FTPClient();FileOutputStream out = null;boolean downloadResult = false;//1 测试连接if (connect(ftpClient, param.getHostname(), param.getPort(), param.getUsername(), param.getPassword())) {try {String localPath = param.getDownloadPath() + param.getFileName();out = new FileOutputStream(new File(localPath));//2 检查工作目录是否存在,不存在返回// if (!ftpClient.changeWorkingDirectory(param.getWorkingPath())) {//return false;// }/** 打开FTP服务器的PASS模式(不记得FTP协议支持的模式请翻到文章第一阶段)* 这个方法的意思就是每次数据连接之前,ftp client告诉ftp server开通一个端口来传输数据. 因为ftp* server可能每次开启不同的端口来传输数据,但是在linux上,由于安全限制,可能某些端口没有开启,可能出现出现阻塞*/ftpClient.enterLocalPassiveMode();// 设置文件的传输方式-二进制ftpClient.setFileType(FTP.BINARY_FILE_TYPE);// 将文件编码成Ftp服务器支持的编码类型(FTP协议里面,规定文件名编码为iso-8859-1,所以目录名或文件名需要转码 。)// 缺少编码转换会导致:从FTP服务器下载下来的文件是破损的,无法被打开downloadResult = ftpClient.retrieveFile(new String(downloadFileName.getBytes(ftpClientCharset), ftpServerCharset), out);out.flush();} catch (IOException e) {log.error("FtpUtils upload in error:{}", e);return false;} finally {try {if (Objects.nonNull(out)) {out.close();}} catch (Exception e) {log.error("FtpUtils upload in error:{}", e);}disconnect(ftpClient);}}return downloadResult;}  「具体使用案例如下:」


推荐阅读