开发中遇到的问题&解决方案(六)

简介: 之前的项目里有用到FTP,需要使用FTP把图片及一些必要文件上传到第三方的FTP服务器上,所以会涉及FTP连接,创建用户,创建文件夹,文件上传等,项目里选用的还是hutool包装的FTP工具类,下面来看看这些功能的在hutool里是怎么包装的。

微信截图_20220531133417.png

前言

之前的项目里有用到FTP,需要使用FTP把图片及一些必要文件上传到第三方的FTP服务器上,所以会涉及FTP连接,创建用户,创建文件夹,文件上传等,项目里选用的还是hutool包装的FTP工具类,下面来看看这些功能的在hutool里是怎么包装的。

1.连接

1)init,配置参数FtpConfig包含主机、端口、用户名、密码及端口,和FtpMode包含主动模式和被动模式,所谓的主动和被动就是FTP的客户端上传文件到服务器端的动作是由人工主动上传还是由其他的事件触发后被动上传,下面是读取配置文件并初始化FTP连接的代码

public Ftp init(FtpConfig config, FtpMode mode) {
   final FTPClient client = new FTPClient();
   //是否需要开启验证功能,默认是不需要的
   client.setRemoteVerificationEnabled(false);
   //主要防止创建中文文件夹时发生乱码的问题 一般都是UTF-8 可以设置为默认的
   final Charset charset = config.getCharset();
   if (null != charset) {
      client.setControlEncoding(charset.toString());
   }
   //超时时间根据具体业务定
   client.setConnectTimeout((int) config.getConnectionTimeout());
   final String systemKey = config.getSystemKey();
   if (StrUtil.isNotBlank(systemKey)) {
      final FTPClientConfig conf = new FTPClientConfig(systemKey);
      final String serverLanguageCode = config.getServerLanguageCode();
      if (StrUtil.isNotBlank(serverLanguageCode)) {
         conf.setServerLanguageCode(config.getServerLanguageCode());
      }
      client.configure(conf);
   }
   try {
      // 连接ftp服务器
      client.connect(config.getHost(), config.getPort());
      client.setSoTimeout((int) config.getSoTimeout());
      // 登录ftp服务器
      client.login(config.getUser(), config.getPassword());
   } catch (IOException e) {
      throw new IORuntimeException(e);
   }
   // 是否成功登录服务器 这里可以根据返回进行业务处理 比如重新连接操作
   final int replyCode = client.getReplyCode(); 
   if (false == FTPReply.isPositiveCompletion(replyCode)) {
      try {
         client.disconnect();
      } catch (IOException e) {
      }
      //省略......
   }
   this.client = client;
   if (mode != null) {
      setMode(mode);
   }
   return this;
}
复制代码

2.创建文件夹

1)这里一般都是先判断文件夹是否存在,不存在再创建新的文件夹,先调existFile方法然后再调mkdir方法

public boolean mkdir(String dir) throws IORuntimeException {
   try {
     //创建文件夹
      return this.client.makeDirectory(dir);
   } catch (IOException e) {
      throw new IORuntimeException(e);
   }
}
复制代码

3.上传,上传部分其实很好理解,直接上代码

public boolean upload(String destPath, String fileName, InputStream fileStream) throws IORuntimeException {
   try {
      //BINARY_FILE_TYPE的值
      //1.destPath为null或""上传到当前路径 一般默认当前路径
      //2.destPath为相对路径则相对于当前路径的子路径
      //3.destPath为绝对路径则上传到此路径
      client.setFileType(FTPClient.BINARY_FILE_TYPE);
   } catch (IOException e) {
      throw new IORuntimeException(e);
   }
   String pwd = null;
   if (this.backToPwd) {
      pwd = pwd();
   }
   if (StrUtil.isNotBlank(destPath)) {
      //这里同样会进行文件夹是否存在 不存在即新建的判断
      mkDirs(destPath);
      if (false == isDir(destPath)) {
         throw new FtpException("Change dir to [{}] error, maybe dir not exist!", destPath);
      }
   }
   try {
      //保存文件到服务器
      return client.storeFile(fileName, fileStream);
   } catch (IOException e) {
      throw new IORuntimeException(e);
   } finally {
      if (this.backToPwd) {
         cd(pwd);
      }
   }
}
复制代码

4.其他操作

1)cd(),切换路径,一般上传都是默认当前路径

2)ls(),遍历当前文件夹下的所有文件

3)lsFiles,遍历某个目录下所有文件和目录

4)stat(),当前文件夹的状态,可根据状态选择进行其他业务操作 上面这些命令是不是很有linux命令的味道,十分的通用

小结

开源软件给我们的开发确确实实带来很多快捷,复制粘贴就用,但是对于初学者来说并不好,就像现在的spring boot的开箱即用,很多人已经忘记了spring的一些配置和底层实现,这些只能说自己去把控吧,了解底层才能走得更远。

目录
相关文章
|
安全 Linux 网络安全
Centos 6.8下修改SSH服务默认端口,看这一篇就够了
Centos 6.8下修改SSH服务默认端口,看这一篇就够了
669 0
|
存储 JavaScript 开发工具
uniapp-实现微信授权登录
uniapp-实现微信授权登录
3777 0
HTML中的<br>、<hr>和<pre>标签使用指南
HTML中的<br>、<hr>和<pre>标签使用指南
1430 2
|
监控 大数据 Java
使用Apache Flink进行大数据实时流处理
Apache Flink是开源流处理框架,擅长低延迟、高吞吐量实时数据流处理。本文深入解析Flink的核心概念、架构(包括客户端、作业管理器、任务管理器和数据源/接收器)和事件时间、窗口、状态管理等特性。通过实战代码展示Flink在词频统计中的应用,讨论其实战挑战与优化。Flink作为大数据处理的关键组件,将持续影响实时处理领域。
2804 5
|
机器学习/深度学习 存储 测试技术
YOLOv11改进策略【模型轻量化】| EMO:ICCV 2023,结构简洁的轻量化自注意力模型
YOLOv11改进策略【模型轻量化】| EMO:ICCV 2023,结构简洁的轻量化自注意力模型
706 13
YOLOv11改进策略【模型轻量化】| EMO:ICCV 2023,结构简洁的轻量化自注意力模型
|
XML Java 程序员
保姆级教程,手把手教你实现SpringBoot自定义starter
保姆级教程,手把手教你实现SpringBoot自定义starter
14912 2
保姆级教程,手把手教你实现SpringBoot自定义starter
|
存储
Ceph Reef(18.2.X)的CephFS高可用集群实战案例
这篇文章是关于Ceph Reef(18.2.X)版本中CephFS高可用集群的实战案例,涵盖了CephFS的基础知识、一主一从架构的搭建、多主一从架构的配置、客户端挂载方式以及fuse方式访问CephFS的详细步骤和配置。
666 3
Ceph Reef(18.2.X)的CephFS高可用集群实战案例
|
机器学习/深度学习 人工智能 测试技术
AI计算机视觉笔记二十五:ResNet50训练部署教程
该项目旨在训练ResNet50模型并将其部署到RK3568开发板上。首先介绍了ResNet50网络,该网络由何恺明等人于2015年提出,解决了传统卷积神经网络中的退化问题。项目使用车辆分类数据集进行训练,并提供了数据集下载链接。环境搭建部分详细描述了虚拟环境的创建和所需库的安装。训练过程中,通过`train.py`脚本进行了15轮训练,并可视化了训练和测试结果。最后,项目提供了将模型转换为ONNX和PT格式的方法,以便在RK3568上部署。
1318 2
|
安全 搜索推荐 应用服务中间件
Web安全-目录遍历漏洞
Web安全-目录遍历漏洞
1216 2
|
存储 Java Spring
SpringBoot异步任务获取HttpServletRequest
这样的操作对于保持异步操作中的请求上下文十分有用,特别是当你需要在日志记录、权限检查或者其他需要请求信息的场景中。确保上下文的正确传递和管理对于构建可靠的,异步处理能力很强的Spring Boot应用至关重要。
1131 3