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 = filesi.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(files0.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);

}

相关推荐
xiaohaiAIgeo20 分钟前
【2026年】HG/T 20656-2024化工暖通空调设计规范:新版标准的变化与影响
java·前端·javascript·科普知识
立少→万能汉编22 分钟前
用“立少→超文本”写静态网页,标签<倍>
服务器·前端·javascript
小强库计算机毕业设计35 分钟前
基于 Spring Boot + Vue3 的校园管理系统
java·spring boot·后端·项目实战·管理系统·技术分享·校园管理系统实战
霸道流氓气质1 小时前
Java中信号量(Semaphore):从本地到分布式
java·开发语言·分布式
怪奇云呼军1 小时前
G.711、Opus 和重采样会拖慢识别吗?闪电智能VoiceAgent 的音频入口怎么选
java·人工智能·python·算法·云计算·音视频
编程令我快乐1 小时前
maven部分构建参数讲解
java·maven
ZC跨境爬虫1 小时前
LeetCode 27. 移除元素(双指针详解 + Java Python 多解法对比)
java·python·leetcode
笨鸟先飞,勤能补拙1 小时前
Web 服务器与计算机网络全景原理
运维·服务器·前端·网络·人工智能·计算机网络·web安全
kisbad2 小时前
Day 036|OpenAI Agents SDK 快速开始:今天跑通第一个 Agent
java·前端·javascript
憧憬成为java架构高手的小白2 小时前
langchain4j框架学习
java