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

简介: 之前的项目里有用到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的一些配置和底层实现,这些只能说自己去把控吧,了解底层才能走得更远。

自由
+关注
目录
打赏
0
0
0
0
2
分享
相关文章
|
11月前
name属性和autocomplete属性
name属性和autocomplete属性。
186 7
域名遍历(dirbuster子域名爆破)课程笔记
域名遍历(dirbuster子域名爆破)课程笔记
除了电商,API在其他行业中的应用有哪些?
API在不同行业中的应用案例表明,它们是实现数字化转型和创新的关键技术。通过API,企业能够提高效率、改善用户体验、推动创新并实现新的商业模式。随着技术的不断发展,API的作用将变得更加重要,它们将继续推动各行各业的发展。
375 2
二十七 | 案例篇:为什么我的磁盘I/O延迟很高?
二十七 | 案例篇:为什么我的磁盘I/O延迟很高?
617 0
SpringSecurity6从入门到实战之初始用户如何存储到内存
Spring Security 在 SpringBoot 应用中默认使用 `UserDetailsServiceAutoConfiguration` 类将用户信息存储到内存中。当classpath有`AuthenticationManager`、存在`ObjectPostProcessor`实例且无特定安全bean时,此配置生效。`inMemoryUserDetailsManager()`方法创建内存用户,通过`UserDetails`对象填充`InMemoryUserDetailsManager`的内部map。若要持久化到数据库,需自定义`UserDetailsService`接口实
自动化运维实践指南:Python脚本优化服务器管理任务
本文探讨了Python在自动化运维中的应用,介绍了使用Python脚本优化服务器管理的四个关键步骤:1) 安装必备库如paramiko、psutil和requests;2) 使用paramiko进行远程命令执行;3) 利用psutil监控系统资源;4) 结合requests自动化软件部署。这些示例展示了Python如何提升运维效率和系统稳定性。
796 8
Jupyter Lab操作文档
**Jupyter Lab 概览:**集成编辑器、终端和自定义组件的环境。可定制主题、显示行号、切换语言。使用时,了解界面布局,通过`Ctrl+Enter`运行代码,`Shift+Enter`前进,`Alt+Enter`新建行。利用Markdown写作,通过Terminal执行命令,用快捷键提升效率,如`a/b`增删单元格,`m/y`切换模式。文件上传下载可使用OBS或终端工具。
Jupyter Lab操作文档
登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问