Springboot实现文件上传至linux指定目录

 更新时间:2025年08月19日 09:26:28   作者:fengfeng N  
这篇文章主要为大家详细介绍了springboot项目如何实现一个文件上传接口,涉及vsftpd服务、SSH协议以及对linux系统的一些配置,希望对大家有所帮助

本篇文章讲述一个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的ip
  port: 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 stub
        Session 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

配置防火墙

开放你要请求的端口,一般vsftp是22端口

sudo ufw allow 22/tcp

通过以上步骤应该就可以实现vsftp文件上传了

到此这篇关于Springboot实现文件上传至linux指定目录的文章就介绍到这了,更多相关Springboot文件上传指定目录内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 如何获得spring上下文的方法总结

    如何获得spring上下文的方法总结

    这篇文章主要介绍了如何获得spring上下文的方法总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • Java状态机的一种优雅写法分享

    Java状态机的一种优雅写法分享

    状态机是一种数学模型,对于我们业务实现有很大的帮助。我们可以用非常多的方法实现状态机,这篇文章就来介绍一个状态机优雅的实现方法,希望对大家有所帮助
    2023-04-04
  • Java爬虫(Jsoup与WebDriver)的使用

    Java爬虫(Jsoup与WebDriver)的使用

    这篇文章主要介绍了Java爬虫(Jsoup与WebDriver)的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Java Servlet实现表白墙的代码实例

    Java Servlet实现表白墙的代码实例

    最近用Servlet做了个小项目,分享给大家,下面这篇文章主要给大家介绍了关于Java Servlet实现表白墙的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • 操作系统的内核态和用户态场景详解

    操作系统的内核态和用户态场景详解

    这篇文章主要介绍了操作系统的内核态和用户态场景,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-06-06
  • DynamicDataSource怎样解决多数据源的事务问题

    DynamicDataSource怎样解决多数据源的事务问题

    这篇文章主要介绍了DynamicDataSource怎样解决多数据源的事务问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • spring jpa 审计功能自定义填充字段方式

    spring jpa 审计功能自定义填充字段方式

    这篇文章主要介绍了spring jpa审计功能自定义填充字段方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • java 面向对象代码块及不同位置对属性赋值的执行顺序

    java 面向对象代码块及不同位置对属性赋值的执行顺序

    这篇文章主要介绍了java面向对象代码块及不同位置对属性赋值的执行顺序,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • Java读写锁ReadWriteLock的创建使用及测试分析示例详解

    Java读写锁ReadWriteLock的创建使用及测试分析示例详解

    这篇文章主要为大家介绍了Java读写锁ReadWriteLock的创建使用及测试分析示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • maven多模块依赖版本不一致问题解决

    maven多模块依赖版本不一致问题解决

    本文主要介绍了maven多模块依赖版本不一致问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05

最新评论