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

相关推荐
程序员张36 分钟前
SpringBoot计时一次请求耗时
java·spring boot·后端
程序员岳焱6 小时前
Java 与 MySQL 性能优化:Java 实现百万数据分批次插入的最佳实践
后端·mysql·性能优化
麦兜*7 小时前
Spring Boot启动优化7板斧(延迟初始化、组件扫描精准打击、JVM参数调优):砍掉70%启动时间的魔鬼实践
java·jvm·spring boot·后端·spring·spring cloud·系统架构
KK溜了溜了7 小时前
JAVA-springboot 整合Redis
java·spring boot·redis
大只鹅7 小时前
解决 Spring Boot 对 Elasticsearch 字段没有小驼峰映射的问题
spring boot·后端·elasticsearch
ai小鬼头7 小时前
AIStarter如何快速部署Stable Diffusion?**新手也能轻松上手的AI绘图
前端·后端·github
天河归来7 小时前
使用idea创建springboot单体项目
java·spring boot·intellij-idea
IT_10248 小时前
Spring Boot项目开发实战销售管理系统——数据库设计!
java·开发语言·数据库·spring boot·后端·oracle
bobz9658 小时前
动态规划
后端
stark张宇8 小时前
VMware 虚拟机装 Linux Centos 7.9 保姆级教程(附资源包)
linux·后端