java上传文件到指定服务器

首先要知道服务器的用户名和密码。

注意:一般情况,如果不是强制要求,尽量不要将文件上传到服务器

步骤:

1.导入依赖

<!--图片上传到服务器需要的依赖-->

<dependency>

<groupId>com.jcraft</groupId>

<artifactId>jsch</artifactId>

<version>0.1.54</version>

</dependency>

2.编写配置文件application.yml

customize:

remoteServer:

sftp:

SFTP_httpBaseUrl: /images/ # 访问附件的地址添加 一个映射 如 /images/ -》 /server-images/

SFTP_httpPort: 80 # 公网访问的端口

SFTP_directory: /server-images/ #主机保存附件目录

SFTP_host: 192.168.1.10 #主机

SFTP_port: 22 #端口号

SFTP_username: root #用户名

SFTP_password: 123456 #密码

3.编写文件上传所需要的工具类

import com.jcraft.jsch.*;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.stereotype.Component;

import org.springframework.web.multipart.MultipartFile;

import java.time.LocalDate;

import java.util.Properties;

import java.util.UUID;

/**

* 类描述:

* 上传文件到服务器的 工具类

*

* @ClassName SFTPUtil

* @Author msi

* @Date 2020/9/2 23:29

* @Version 1.0

*/

@Component

public class SFTPUtil {

/**

* 返回公网访问的地址前缀

*/

@Value("${customize.remoteServer.sftp.SFTP_httpBaseUrl}")

protected String baseUrl;

/**

* 公网访问的端口

*/

@Value("${customize.remoteServer.sftp.SFTP_httpPort}")

protected int port;

/**

* 主机保存的目录

*/

@Value("${customize.remoteServer.sftp.SFTP_directory}")

protected String directory;

/**

* 主机的IP

*/

@Value("${customize.remoteServer.sftp.SFTP_host}")

protected String host;

/**

* ssh端口

*/

@Value("${customize.remoteServer.sftp.SFTP_port}")

protected int sshPort;

/**

* 用户名

*/

@Value("${customize.remoteServer.sftp.SFTP_username}")

protected String username;

/**

* 密码

*/

@Value("${customize.remoteServer.sftp.SFTP_password}")

protected String password;

/**

* 上传多文件到指定远程主机

* @param files 文件数组

* @return list

*/

public List<String> uploadMultipartFilesToServer(MultipartFile[] files) throws SftpException, JSchException, IOException {

List<String> list = new ArrayList<>();

ChannelSftp sftp = null;

Session session = null;

sftp = this.connect(this.host, this.sshPort, this.username, this.password);

session = sftp.getSession();

for (int i = 0; i < files.length; i++) {

String originalFilename = files[i].getOriginalFilename();

// 生成文件夹名 yyyy-mm

String relativePath = new StringBuilder().append(LocalDate.now().getYear())

.append("-").append(LocalDate.now().getMonthValue()).toString();

String uuid = UUID.randomUUID().toString().replace("-", "").toLowerCase();

int lastIndex = originalFilename.lastIndexOf(".");

String fileSuffix = originalFilename.substring(lastIndex);

String filePrefix = originalFilename.substring(0, lastIndex);

String fileName = new StringBuilder().append(filePrefix).append(uuid).append(fileSuffix).toString();

// 文件上层目录

String directory = this.directory + relativePath;

// 创建文件夹

this.createDir(directory, sftp);

// 进入文件夹内

sftp.cd(directory);

// 创建文件

sftp.put(files[0].getInputStream(), fileName);

// 拼接返回格式

String s = new StringBuilder("http://").append(this.host).append(":").append(this.port)

.append(this.baseUrl).append(relativePath).append("/").append(fileName).toString();

list.add(s);

}

// 关掉连接

sftp.disconnect();

sftp.getSession().disconnect();

return list;

}

/**

* 建立连接

* @param host 主机

* @param port 端口

* @param username 用户名

* @param password 密码

* @return

*/

public ChannelSftp connect(String host, int port, String username,

String password) {

ChannelSftp sftp = null;

try {

JSch jsch = new JSch();

jsch.getSession(username, host, port);

Session sshSession = jsch.getSession(username, host, port);

sshSession.setPassword(password);

Properties sshConfig = new Properties();

sshConfig.put("StrictHostKeyChecking", "no");

sshSession.setConfig(sshConfig);

sshSession.connect();

Channel channel = sshSession.openChannel("sftp");

channel.connect();

sftp = (ChannelSftp) channel;

} catch (Exception e) {

e.printStackTrace();

}

return sftp;

}

/**

* 创建目录

*

*/

public void createDir(String createpath, ChannelSftp sftp) {

try {

if (isDirExist(sftp, createpath)) {

sftp.cd(createpath);

}

String pathArry[] = createpath.split("/");

StringBuffer filePath = new StringBuffer("/");

// 循环创建目录

for (String path : pathArry) {

if (path.equals("")) {

continue;

}

filePath.append(path + "/");

if (isDirExist(sftp, filePath.toString())) {

sftp.cd(filePath.toString());

} else {

// 建立目录

sftp.mkdir(filePath.toString());

// 进入并设置为当前目录

sftp.cd(filePath.toString());

}

}

sftp.cd(createpath);

} catch (SftpException e) {

e.printStackTrace();

}

}

/**

* 判断目录是否存在

*/

public boolean isDirExist(ChannelSftp sftp, String directory) {

boolean isDirExistFlag = false;

try {

SftpATTRS sftpATTRS = sftp.lstat(directory);

isDirExistFlag = true;

return sftpATTRS.isDir();

} catch (Exception e) {

if (e.getMessage().toLowerCase().equals("no such file")) {

isDirExistFlag = false;

}

}

return isDirExistFlag;

}

}

4.编写对应controller进行调试

@Autowired

private UpdateFileUtil sftpUtil;

/**

* 上传文件到服务器

*

* @param files 图片

* @return

*/

@PostMapping("/file")

public Result<List<String>> file(MultipartFile[] files) throws Exception {

List<String> paths = sftpUtil.uploadMultipartFilesToServer(files);

return Result.ofSuccess(paths);

}

相关推荐
Spring_java_gg3 分钟前
如何抵御 Linux 服务器黑客威胁和攻击
linux·服务器·网络·安全·web安全
✿ ༺ ོIT技术༻4 分钟前
Linux:认识文件系统
linux·运维·服务器
恒辉信达5 分钟前
hhdb数据库介绍(8-4)
服务器·数据库·mysql
blammmp11 分钟前
Java:数据结构-枚举
java·开发语言·数据结构
暗黑起源喵29 分钟前
设计模式-工厂设计模式
java·开发语言·设计模式
WaaTong34 分钟前
Java反射
java·开发语言·反射
我言秋日胜春朝★34 分钟前
【Linux】冯诺依曼体系、再谈操作系统
linux·运维·服务器
wowocpp1 小时前
ubuntu 22.04 server 格式化 磁盘 为 ext4 并 自动挂载 LTS
服务器·数据库·ubuntu
九圣残炎1 小时前
【从零开始的LeetCode-算法】1456. 定长子串中元音的最大数目
java·算法·leetcode
wclass-zhengge1 小时前
Netty篇(入门编程)
java·linux·服务器