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

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

目录
相关文章
|
10天前
|
前端开发 Android开发 开发者
移动应用的构建之路:从开发到部署
【10月更文挑战第32天】本文将深入探讨移动应用的开发和部署,包括移动操作系统的选择、应用开发的生命周期、以及如何将应用有效地推向市场。我们将通过实际代码示例和清晰的步骤指导,帮助读者理解移动应用开发的全过程。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧。让我们一起探索移动应用的世界,发现它的魅力和挑战吧!
|
6月前
|
算法 Java 调度
死锁预防与解决方案
死锁预防与解决方案
|
存储 编解码 监控
报告厅解决方案
大型单位、企业都建有报告厅,单位搭建报告厅的目的是为了召开各类会议、学术讨论、演讲、报告、新闻发布、多媒体教学培训、观看电影等活动提供卓越的音质效果、清晰的画面显示以及简单便捷的集中控制。报告厅通常会涉及举办活动时将现场画面的保存记录、活动画面以直播的形式在报告厅之外的其他屏幕上观看(因为报告厅容纳人数有限的原因)。针对这两个需求我们做了以下解决方案
|
设计模式 前端开发 Java
开发中遇到的问题&解决方案(一)
在开发过程在我们往往会遇到很多的开发阻碍或者因为原生框架的不支持导致的一系列问题或者有的不是问题,是我们使用普通的大量的复制粘贴改改就能用的代码去实现功能,这样使得代码很冗余,我们能不能去尝试找一些好的方案比如采用设计模式这些去优化我们的代码,实现代码简洁明了,易扩展呢?答案是肯定的。这个系列文章会使用案列加解决方案的形式为大家讲解,那下面我们开始吧。
752 0
开发中遇到的问题&解决方案(一)
|
JSON 自然语言处理 Java
开发中遇到的问题&解决方案(十)
我们在开发中一般遇到会对于敏感词的过滤或者屏蔽,因为之前做过社区类的APP,在这方面也踩了不少的坑,算是也积累了一点点的经验,那么今天我们来看看hutool里对于敏感词的一些操作,工具类SensitiveUtil()
399 0
开发中遇到的问题&解决方案(十)
|
网络协议 数据安全/隐私保护
开发中遇到的问题&解决方案(七)
邮件发送相信大家都不陌生吧,一般是用于电商平台比如京东下单后订单信息的邮件发送或者移动这种的月度账单的邮件发送,再有就是通过绑定的邮箱进行密码重置,由邮箱跳转到指定的密码重置页进行密码重置操作。那么下面我们来看看hutool里对于邮件发送的包装是怎么样的。
202 0
开发中遇到的问题&解决方案(七)
开发中遇到的问题&解决方案(四)
今天继续hutool工具类的认识,废话不多说下面直接进入主题。
306 0
开发中遇到的问题&解决方案(四)
|
Java
开发中遇到的问题&解决方案(八)
以前的一个老项目里使用过ZXing进行会员和门店二维码的生成操作,当时出现过Java版本升级后不兼容的问题,很是麻烦,于是替换成了hutool里的二维码生成,下面我们来看看具体的实现。
201 0
开发中遇到的问题&解决方案(八)
|
数据安全/隐私保护
开发中遇到的问题&解决方案(五)
在开发过程中,图片是必不可少的,除了图片的上传下载以外,图片压缩也是很常见的。 下面我们来看看hutool工具类里图片压缩的方法。
368 0
开发中遇到的问题&解决方案(五)
|
Java 数据库 微服务
开发中遇到的问题&解决方案(三)
我们在日常的开发中会使用到很多工具类,比如最常用的Http请求的,或者日期工具类,处理时间差或者对日期进行特殊处理的,还有就是图片上传类的,比如阿里云或者腾讯云得SSO图片上传,以及Excel文件的导入导出。那这些工具类基本上都是跟着项目的,就是每个项目都写各自的工具类,如果分工明确细化到小组那重复代码就多了,那把工具类集成成一个项目类呢,由一个人去维护这个工具类工程,如果是微服务项目就是一个工具类的微服务,这样做的好处就很明显了,至少公司的研发部在使用到常用的工具类时不必再去网上找到。
317 0
开发中遇到的问题&解决方案(三)