1.文件上传
1.1后端使用MultipartFile接收上传的文件,并返回文件全路径地址(完整的网络地址,其中文件存储地址是通过nginx配置的映射路径。eg:http://8.142.104.85/testFile/333.png)
步骤:
1.后端使用MultipartFile接收到文件。
2.代码中操作登录远程服务器,并将文件流读入到服务器指定文件夹。
3.返回文件相对路径地址并保存,eg:/testFile/333.png
4.想要获取文件全路径,就在文件相对路径前面拼上nginx配置的文件映射路径。eg:http://8.142.104.85/testFile/333.png
2.文件下载(通常有两种方式)
2.1网络地址方式(接口拼接并返回完整网络地址,由前端处理预览、下载等功能。这种比较常用)
步骤:
1.从数据库中获取文件相对路径。eg:/testFile/333.png
2.获取nginx配置的文件映射路径并拼接文件相对路径。eg:http://8.142.104.85/testFile/333.png
3.返回该路径,交由前端处理。
2.1文件流方式(后端获取拼接文件地址并读取文件流后写到response中返回给前端,前端拿到流之后就可以转换为文件且进行下载或预览。注意:前端需要设置 responseType: ‘blob’)
步骤
1.通过后端接口接收到文件相关路径。
2.登录服务器并下载文件到临时文件夹。
3.从临时文件夹中读取文件并转成字节数组。
4.将字节数组写入response中并返回给前端。
5.删除临时文件。
远程服务器操作通用代码如下:
package com.mozheng.manageframe.mmmm;
import com.jcraft.jsch.*;
import java.io.*;
import java.util.Objects;
import java.util.Properties;
import java.util.Vector;
/**
* @Description: 服务器登录、关闭,文件上传、下载,命令执行
*/
public class SSHRemoteCall {
/**
* ip地址
**/
private static String ipAddress = "8.142.124.85";
/**
* 端口号
**/
private static int port = 22;
/**
* 账号
**/
private static String userName = "服务器账号名称";
/**
* 密码
**/
private static String password = "服务器账号密码";
/**
* JSCH session
**/
private Session session;
/**
* 登录远程服务器
* @param ipAddress ip地址
* @param port 端口
* @param userName 账号名称
* @param password 账号密码
* @return void
**/
public void sshLogin(String ipAddress, int port, String userName, String password) throws Exception {
JSch jSch = new JSch();
try {
// 获取到jSch的session, 根据用户名、主机ip、端口号获取一个Session对象
session = jSch.getSession(userName, ipAddress, port);
session.setPassword(password);
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
// 设置超时
session.setTimeout(3000);
session.connect();
} catch (JSchException e) {
System.out.println("连接远程服务异常。。。。。。");
}
}
/**
* 关闭连接
* @return void
**/
public void closeSession() {
if (!Objects.isNull(session)) {
session.disconnect();
}
}
/**
* 执行相关的命令
* @param command 命令
*/
public void execCommand(String command) throws IOException {
InputStream in = null;// 输入流(读)
Channel channel = null;// 定义channel变量
try {
// 如果命令command不等于null
if (command != null) {
// 打开channel
//说明:exec用于执行命令;sftp用于文件处理
channel = session.openChannel("exec");
// 设置command
((ChannelExec) channel).setCommand(command);
// channel进行连接
channel.connect();
// 获取到输入流
in = channel.getInputStream();
// 执行相关的命令
String processDataStream = processDataStream(in);
// 打印相关的命令
System.out.println("1、打印相关返回的命令: " + processDataStream);
}
} catch (JSchException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (in != null) {
in.close();
}
if (channel != null) {
channel.disconnect();
}
}
}
/**
* 对将要执行的linux的命令进行遍历
* @param in
* @return java.lang.String
**/
public String processDataStream(InputStream in) throws Exception {
StringBuffer sb = new StringBuffer();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String result = "";
try {
while ((result = br.readLine()) != null) {
sb.append(result);
}
} catch (Exception e) {
throw new Exception("获取数据流失败: " + e);
} finally {
br.close();
}
return sb.toString();
}
/**
* 上传文件
* @param directory 文件上传目标地址 eg:/tmp/333.png
* @param uploadFile 文件本地地址 eg:C:\\Users\\15156\\Desktop\\b3d6523b-f86e-4fa2-b40a-16002ea2358a.png
* @return void
**/
public void uploadFile(String directory, String uploadFile) throws JSchException, FileNotFoundException, SftpException {
// 打开channelSftp
ChannelSftp channelSftp = (ChannelSftp) session.openChannel("sftp");
// 远程连接
channelSftp.connect();
// 创建一个文件名称问uploadFile的文件
File file = new File(uploadFile);
// 将文件进行上传(sftp协议)
// 将本地文件名为src的文件上传到目标服务器,目标文件名为dst,若dst为目录,则目标文件名将与src文件名相同.
// 采用默认的传输模式:OVERWRITE
channelSftp.put(new FileInputStream(file), directory, ChannelSftp.OVERWRITE);
// 切断远程连接
channelSftp.exit();
System.out.println(file.getName() + " 文件上传成功.....");
}
/**
* 下载文件
* 采用默认的传输模式:OVERWRITE
*
* @param src inux服务器文件地址 eg:/tmp/333.png
* @param dst 本地存放地址 eg:C:\\Users\\15156\\Desktop\\
* @return void
**/
public void fileDownload(String src, String dst) throws JSchException, SftpException {
// src 是linux服务器文件地址,dst 本地存放地址
ChannelSftp channelSftp = (ChannelSftp) session.openChannel("sftp");
// 远程连接
channelSftp.connect();
// 下载文件,多个重载方法
channelSftp.get(src, dst);
// 切断远程连接,quit()等同于exit(),都是调用disconnect()
channelSftp.quit();
// channelSftp.disconnect();
System.out.println(src + " 下载文件成功");
}
/**
* 删除指定文件
*
* @param directoryFile 要删除文件全路径 eg:/user/local/333.png
* @return void
**/
public void deleteFile(String directoryFile) throws SftpException, JSchException {
// 打开openChannel的sftp
ChannelSftp channelSftp = (ChannelSftp) session.openChannel("sftp");
// 远程连接
channelSftp.connect();
// 删除文件
channelSftp.rm(directoryFile);
// 切断远程连接
channelSftp.exit();
System.out.println(directoryFile + "已删除");
}
/**
* 列出目录下的文件
*
* @param directory 文件所在目录 eg:/user/local
* @return java.util.Vector
**/
public Vector listFiles(String directory) throws JSchException, SftpException {
ChannelSftp channelSftp = (ChannelSftp) session.openChannel("sftp");
// 远程连接
channelSftp.connect();
// 显示目录信息
Vector ls = channelSftp.ls(directory);
// 切断连接
channelSftp.exit();
return ls;
}
public static void main(String[] args) {
// 连接到指定的服务器
SSHRemoteCall sshRemoteCall = new SSHRemoteCall();
try {
// 1、首先远程连接ssh
sshRemoteCall.sshLogin(ipAddress, port, userName, password);
// 打印信息
System.out.println("ip地址: " + ipAddress + ",账号: " + userName + ",连接成功.....");
// 2、执行相关的命令
// 查看磁盘空间大小
// String command = "df -lh ";
// 查看cpu的使用情况
String command = "top -bn 1 -i -c ";
sshRemoteCall.execCommand(command);
// 3、上传文件
/*String directory = "/tmp/333.png";// 目标文件名
String uploadFile = "C:\\Users\\15156\\Desktop\\b3d6523b-f86e-4fa2-b40a-16002ea2358a.png";// 本地文件名
SSHRemoteCall.getInstance().uploadFile(directory, uploadFile);*/
// 4、下载文件
// src 是linux服务器文件地址,dst 本地存放地址,采用默认的传输模式:OVERWRITE
//test为文件名称哈
/*String src = "/tmp/333.png";
String dst = "C:\\Users\\15156\\Desktop\\";
SSHRemoteCall.getInstance().fileDownload(src, dst);*/
// 5、刪除文件
/*String deleteDirectoryFile = "/tmp/333.png";
SSHRemoteCall.getInstance().deleteFile(deleteDirectoryFile);*/
// 展示目录下的文件信息
String lsDirectory = "/tmp";
Vector vector = sshRemoteCall.listFiles(lsDirectory);
vector.stream().forEach(item -> System.out.println(item.toString()));
} catch (Exception e) {
System.err.println("远程连接失败......" + e);
} finally {
// 关闭连接
sshRemoteCall.closeSession();
}
}
}