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

相关推荐
315356691322 分钟前
DeepSeek Harness 发布后,我没急着跑 Demo,先把 `.agents/` 翻了一遍
前端·后端·github
Nturmoils35 分钟前
不在公司,也能连回办公电脑:用 Natapp 打通 Windows 远程桌面
后端
LEE36 分钟前
AI Agent 都在疯狂加功能,它说:我全砍了
前端·后端
桦说编程1 小时前
记一次 Coding Agent 改动带来的bug与启示
后端·agent·vibecoding
302wanger1 小时前
Mole-在终端里给Mac做减法
后端
一心只读圣贤书1 小时前
本地后端环境与前端联调总结(前端小白视角)
后端
杨利杰YJlio2 小时前
KB5121003更新详解:安全启动证书、AI组件、资源管理器与安装验证
前端·javascript·后端
忙碌碌粒粒橙2 小时前
《用户付一次钱,你的系统为什么处理了两遍:Webhook 重复投递避坑指南》
后端
数字化探索者笔记2 小时前
从零搭建:VMware 银河麒麟V10部署 OceanBase 4.2.5 企业版集中式数据库
后端
西门老铁2 小时前
JWT 是什么?三段式结构、签名原理与 6 个安全坑一次讲透
后端·面试