Springboot sftp 文件操作实践

胡雁哀鸣夜夜飞,胡儿眼泪双双落。

1 前言

在项目开发中经常会遇到文件操作的场景,最近遇到了一个项目对账的业务,项目收集各个业务方的对账文件,进行业务对账。收集业务方的对账文件就是通过 sftp 的方式,在本文中将介绍如何创建 sftp 账号以及上传、下载、删除、查看文件的实践,后续将在此基础之上开展对账业务的分享。

2 centos 系统创建 sftp 账号

在使用 sftp 操作文件之前,需要先在服务器上创建 sftp 账号,具体操作如下所示:

bash 复制代码
# 1 创建文件上传目录
mkdir /data/upload

# 2 创建用户组  egrep sftp /etc/group 查询用户组信息
groupadd sftp

# 3 创建sftp 用户并创建文件上传目录并设置用户密码
useradd -d /data/upload/clptsftp -m -g sftp -s /sbin/nologin clptsftp
mkdir -p /data/upload/clptsftp/upload
passwd clptsftp

# 4 修改用目录属性 root 和 clptsftp
chown root:root -R /data/upload/clptsftp
chmod 755 -R /data/upload/clptsftp
chown -R clptsftp:sftp /data/upload/clptsftp/upload
chmod 755 /data/upload/clptsftp/upload

# 5 修改 /etc/ssh/sshd_config 文件
#Subsystem      sftp    /usr/libexec/openssh/sftp-server  #需要注释
Subsystem sftp internal-sftp  #使用系统自带的internal-sftp
Match Group sftp
Match User clptsftp
ChrootDirectory /data/upload/clptsftp
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no

# 6 重新启动 sshd 
systemctl restart sshd

# 7 尝试连接, 如果连接失败查看 tail /var/log/secure -n 20 进行排查
sftp clptsftp@ip 

创建 sftp 账号后,上传了文件后如下图所示,账号上传下载文件正常。

3 sftp 文件上传下载

在项目开发中操作文件的上传下载,需要先在项目中添加 jsch 依赖:

xml 复制代码
<dependency>
    <groupId>com.jcraft</groupId>
    <artifactId>jsch</artifactId>
    <version>0.1.55</version>
</dependency>

jsch 使用了 java 实现了 ssh2 的连接,可以类比为 jdbc, 它可以帮助开发者连接 sshd 服务,使用端口转发,x11 转发,文件传输等功能,在 java 程序中集成可以实现对远程服务器的操作。

3.1 创建jsch连接

如下图所示,使用 jsch 的起手式如左边所示,在本文中使用的是 sftp, 用于创建 sftp 的通道连接,此外如果需要远程执行服务器上的脚本,即可使用 exec 的方式。

连接 sftp 服务器时,需要根据主机、用户名、端口、密码等参数创建 ssh 会话,然后通过会话创建 sftp 通道连接。 对于 sftp 的操作,常用的命令如下所示:

bash 复制代码
cd 切换到指定的目录
ls 展示当前目录下的所有文件
lstat 获取当前目录的属性
put 上传保存文件
get 查看获取文件
mkdir 创建目录
rm 删除文件
rmdir 删除目录
pwd 获取当前目录地址
rename 重命名文件
3.2 sftp 上传文件

如下图所示,即可实现 sftp 的文件上传,这里在上传时需要判断上传的目录是否存在,如果目录不存在,则需要循环创建目录,这里不能像 mkdir -p 那样一次性的创建完整的目录。对于文件的上传,可以使用文件流的方式,或者采用文件地址的方式即可实现文件的上传。对于文件的上传,默认采用的模式为覆盖方式,mode 参数选择 0 覆盖 1 恢复模式 2 追加模式

在控制器层的代码如下所示,在使用 sftp 上传文件时,需要先初始化 sftp , 创建对应的会话和连接才能使用。

3.3 sftp 下载文件

对于文件的下载,也可以采用两种方式,将文件写入对应的文件目录或者将文件内容写入 response 中也可以实现文件的下载。

文件下载的代码在控制器层如下所示:

3.3 sftp 文件查看和删除

文件的查看和删除,采用的方式和在服务器上执行的命令类似,在删除文件时,需要判断删除的是文件还是目录,使用的命令是有所差异的。

查看和删除的代码如下所示:

4 上传实践

在上传文件时,需要按照日期来建立目录,用来存放文件,文件存储完成后,需要将文件存储后的路径进行返回,用于文件的查看。

5 总结

在本文中,主要讲述的是如何使用 sftp 工具来上传、下载、查看和删除文件,所涉及的代码已经上传至 github, 欢迎大家点赞关注。项目 github 地址 springboot-auth

相关推荐
HaiFan.3 小时前
SpringBoot 事务
java·数据库·spring boot·sql·mysql
2401_882727573 小时前
低代码配置式组态软件-BY组态
前端·后端·物联网·低代码·前端框架
追逐时光者4 小时前
.NET 在 Visual Studio 中的高效编程技巧集
后端·.net·visual studio
大梦百万秋4 小时前
Spring Boot实战:构建一个简单的RESTful API
spring boot·后端·restful
斌斌_____5 小时前
Spring Boot 配置文件的加载顺序
java·spring boot·后端
路在脚下@5 小时前
Spring如何处理循环依赖
java·后端·spring
苹果醋35 小时前
React系列(八)——React进阶知识点拓展
运维·vue.js·spring boot·nginx·课程设计
海绵波波1076 小时前
flask后端开发(1):第一个Flask项目
后端·python·flask
小奏技术7 小时前
RocketMQ结合源码告诉你消息量大为啥不需要手动压缩消息
后端·消息队列
等一场春雨7 小时前
springboot 3 websocket react 系统提示,选手实时数据更新监控
spring boot·websocket·react.js