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);

}

相关推荐
qq_150841999 分钟前
SQL的insert和update二合一指令
java·数据库·sql
2601_9647028913 分钟前
Claude Opus 5 API 开发实战:对话、文本生成与结构化输出
java·服务器·前端
聚焦前沿15 分钟前
水动力优化导流罩:原理、数据与实船验证
大数据·服务器·数据库·人工智能
Sayuanni%317 分钟前
Spring IOC
java·spring·rpc
huainingning18 分钟前
防火墙重启后ssl登录提示证书过期临时解决方法
linux·服务器·ssl
风景的人生20 分钟前
流式输出与springboot中的响应式编程
java·spring boot·ai编程
sulikey24 分钟前
服务器安装Docker教程。如何在云服务器安装Docker容器?
运维·服务器·ubuntu·docker·安装教程·云服务器
长不胖的路人甲39 分钟前
斐波那契查找Java 实现 + 完整思路
java·开发语言
池央43 分钟前
NAS里的大文件怎么快速传?用Copyparty搭建轻量文件服务器
运维·服务器·cpolar
金海境科技44 分钟前
【服务器数据恢复】H3C CAS虚拟化平台HP存储qcow2文件损坏快照丢失数据恢复案例
服务器·数据库·经验分享