首页 > 社交 > 科普中国

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

常驻编辑 科普中国 2022-09-25 工具   表头   轮子   文件系统   实体   框架   功能   文件   项目   数据
QnK拜客生活常识网

/**
     * 导出案例
     *
     * @param response
     */
    public void exportUserListWithCsv(HttpServletResponse response) {
        List exportItem = new ArrayList<>();
        // 查询数据
        List dbData = userService.list();
        // 使用字符串数组方式作为表头导出csv数据
        List 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 {
        // 此处先校验导入的文件类型是否为csv
        String 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工具就很有效了。」QnK拜客生活常识网

  Ftp工具使用的commons-net开源框架进行实现,具体的集成流程之前单独使用一篇文章进行了非常详细的介绍,有需要的读者可以点击后面链接查看:手把手教你搭建ftp服务器,并用程序完成ftp上传下载功能QnK拜客生活常识网

  「部分源码如下:」QnK拜客生活常识网

/**
     * 上传
     *
     * @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;
    }
    

相关阅读:

  • 微信深度清理工具在哪里进去
  • 皮沙发怎样清洗用什么工具
  • 科麦斯工具怎么样(科麦斯工具套装怎么样)
  • pe工具哪个好(微pe工具箱有哪些工具)
  • 工具在哪里找(绘画工具在哪里)
  • ftp软件哪个好(ftp客户端工具)
  • root工具哪个好用(安卓手机一键root软件哪个好)
  • ps渐变工具在哪里(ps渐变调整层在哪)
  • ps的魔法棒在哪里(2021版ps魔棒工具在哪)
  • ps魔法棒在哪里(电脑ps魔棒工具在哪里)
    • 网站地图 |
    • 声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。文章内容仅供参考,不做权威认证,如若验证其真实性,请咨询相关权威专业人士。