本篇文章讲述一个springboot项目如何实现一个文件上传接口,涉及vsftpd服务、SSH协议以及对linux系统的一些配置。
一、springboot工程部分
本篇文章略过springboot创建过程,具体见之前发过的文章
1.1在pom.xml中添加SFTP(SSH 文件传输协议)的依赖(请注意你的版本号,下面不在赘述)
jsch
是一个用Java编写的SSH2协议库,它可以用来实现SFTP客户端和服务器端的功能。
<!-- 添加sftp依赖--><dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifactId><version>0.1.55</version></dependency>
1.2application.yml配置文件
sftp_ubantu:host: 192.168.000.000 //你的linux的ipport: 22 //端口号username: root //用户名password: *********remoteDir: /XXXX/XXXX/XXXX //指定文件路径
1.3SFTP工具类
import com.jcraft.jsch.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.io.InputStream;@Component
public class SFTPUtil {private static String host;@Value("${sftp_ubantu.host}")public void setHost(String host) {SFTPUtil.host = host;}private static Integer port;@Value("${sftp_ubantu.port}")public void setPort(Integer port) {SFTPUtil.port = port;}private static String username;@Value("${sftp_ubantu.username}")public void setUsername(String username) {SFTPUtil.username = username;}private static String password;@Value("${sftp_ubantu.password}")public void setPassword(String password) {SFTPUtil.password = password;}private static String remoteDir;@Value("${sftp_ubantu.remoteDir}")public void setRemoteDir(String remoteDir) {SFTPUtil.remoteDir = remoteDir;}public static void uploadFile(InputStream inputStream, String fileName) throws IOException, JSchException, SftpException {// TODO Auto-generated method stubSession session = null;Channel channel = null;JSch jsch = new JSch();try {//创建会话session = jsch.getSession(username, host, port != null ? port : 22);//设置密码//设置密码session.setPassword(password);//设置第一次登陆的时候提示,可选值:(ask | yes | no)session.setConfig("StrictHostKeyChecking", "no");//设置连接超时时间session.connect(30000);//创建sftp通信通道channel = session.openChannel("sftp");channel.connect(1000);//创建sftp客户端ChannelSftp sftp = (ChannelSftp) channel;//进入远程目录sftp.cd(remoteDir);//上传文件sftp.put(inputStream, fileName);inputStream.close();} finally {//关流操作if (session != null) {session.disconnect();}if (channel != null) {channel.disconnect();}}}}
1.4接口代码
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.SftpException;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;@RestController
@RequestMapping("/test")
public class FileController {//上传文件@PostMapping("/upload")public Result uploadFile(@RequestParam("file") MultipartFile file) {if (file.isEmpty()) {return Result.error("文件为空,请重新上传文件");}InputStream inputStream = null;try {inputStream = file.getInputStream();SFTPUtil.uploadFile(inputStream, file.getOriginalFilename());return Result.success("文件上传成功");} catch (IOException | JSchException | SftpException e) {return Result.error("文件上传失败"+e.getMessage());}finally {if (inputStream != null) {try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}}}
}
二、Linux系统中的相关配置
2.1 配置虚拟机网络
首先将虚拟机的网络进行配置,选用桥接模式,使得虚拟机与本机在同一字段
如果不是桥接模式则依次点击虚拟机----->设置 或者按CTRL+D唤出虚拟机设置
2.2ubuntu安装sftp服务器
更新系统包确保系统包是最新的。打开终端运行下面的命令
sudo apt update
sudo apt upgrade -y
使用apt包管理器安装vsftpd。
sudo apt install vsftpd
检查vsftpd服务是否正在运行:
sudo systemctl status vsftpd
2.3配置vsftp服务器
要配置vsftpd服务器以允许root用户和普通用户上传文件和创建文件夹
- 打开终端。
- 使用文本编辑器编辑vsftpd配置文件。例如,使用
vim或vi
sudo vim /etc/vsftpd.conf
- 在配置文件中找到以下几个被注释的命令行,按i键切换至插入模式,删掉#取消注释
//允许写命令
write_enable=YES
//允许上传
upload_enable=YES
按shift+:进入命令模式,输入wq存盘退出
当配置文件发送改动的时候需要重启vsftpd服务器
sudo systemctl resatrt vsftpd
2.4安装OpenSSH服务器
OpenSSH 是一个广泛使用的 SSH 服务器实现,它默认支持 SFTP,运行下面命令。
sudo apt install openssh-server -y
安装完成后,OpenSSH 服务器会自动启动并设置为开机自启。您可以使用以下命令检查 SSH 服务的状态:
sudo systemctl status ssh
如果服务没有运行,可以使用以下命令手动启动它:
sudo systemctl start ssh
6.配置防火墙
开放你要请求的端口,一般vsftp是22端口
sudo ufw allow 22/tcp
通过以上步骤应该就可以实现vsftp文件上传了