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。

相关推荐
LHICOD30 分钟前
Linux-2
java·linux·后端·jar·vmware·svm·vm
小杨互联网36 分钟前
Go 现代 CLI 工具离线镜像合集
开发语言·后端·golang·开源·go·命令行
lazy H41 分钟前
【计算机网络】第 15 篇:Java BIO、NIO 与高并发网络通信——从 Socket 理解 I/O 模型
网络·后端·tcp/ip·计算机网络·nio·408
geovindu1 小时前
rust: Semaphore Pattern
开发语言·后端·设计模式·rust·代理模式·企业级信号量模式·同步型模式
CoderYanger3 小时前
Java EE 进阶:5. Spring IoC&DI(第三弹):Spring DI
java·开发语言·spring boot·spring·面试·java-ee·mvc
Thneonl3 小时前
Claude Code 频繁 Compacting?发布次日我根治了 2 个痛点
后端·rust
环境栈笔记4 小时前
指纹浏览器安卓怎么用?从运行位置到功能验收,先把三种方案分清
前端·人工智能·后端·自动化
小小张说故事4 小时前
Python 的 list 为什么能装下任何类型?拆开 PyObject* 数组,以及它让你多付了多少内存
后端·python
小蒜学长5 小时前
基于SpringBoot 框架的自媒体新闻系统的设计与实现(代码+数据库+LW)
java·spring boot·后端·mysql数据库·自媒体新闻管理系统
IT_陈寒5 小时前
JavaScript实战技巧总结:深挖数组遍历的性能陷阱与实战解法
前端·人工智能·后端