java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Springboot文件上传指定目录

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

作者: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文件上传指定目录内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文