版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014338530/article/details/84580696
项目迁移,之前在服务器A上面的项目因为需求需要迁移至服务器B,该项目使用的是A服务器上的一个图片库地址,所以需要对图片上传和下载功能进行修改,满足可以跨服务器进行操作。
使用的是SCPClient,进行操作。首先是Maven依赖
<dependency>
<groupId>ch.ethz.ganymed</groupId>
<artifactId>ganymed-ssh2</artifactId>
<version>build210</version>
</dependency>
其次工具类代码如下:
import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.SCPClient;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;
import org.apache.log4j.Logger;
import java.io.*;
public class LinuxFileUploadUtils {
private static Logger logger = Logger.getLogger(LinuxFileUploadUtils.class);
private static String IP = "*********";
private static int PORT = ****;
private static String USER = "*******";//登录用户名
private static String PASSWORD = "";//生成私钥的密码和登录密码,这两个共用这个密码
private static Connection connection = new Connection(IP, PORT);
private static String PRIVATEKEY = "*******";// 本机的私钥文件地址
private static boolean usePassword = false;// 使用用户名和密码来进行登录验证。如果为true则通过用户名和密码登录,false则使用rsa免密码登录
private static final String DEFAULTCHART = "UTF-8";
/**
* ssh用户登录验证,使用用户名和密码来认证
*
* @param user
* @param password
* @return
*/
public static boolean isAuthedWithPassword(String user, String password) {
try {
return connection.authenticateWithPassword(user, password);
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
/**
* ssh用户登录验证,使用用户名、私钥、密码来认证 其中密码如果没有可以为null,生成私钥的时候如果没有输入密码,则密码参数为null
*
* @param user
* @param file
* @param password
* @return
*/
public static boolean isAuthedWithPublicKey(String user, File file, String password) {
try {
return connection.authenticateWithPublicKey(user, file, password);
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
public static boolean isAuth() {
if (usePassword) {
return isAuthedWithPassword(USER, PASSWORD);
} else {
File file = new File(PRIVATEKEY);
if (file.exists()) {
return isAuthedWithPublicKey(USER, file, PASSWORD);
}
return false;
}
}
public static void getFile(String remoteFile, String path) {
try {
connection.connect();
boolean isAuthed = isAuth();
if (isAuthed) {
System.out.println("认证成功!");
SCPClient scpClient = connection.createSCPClient();
scpClient.get(remoteFile, path);
} else {
System.out.println("认证失败!");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
connection.close();
}
}
public static void putFile(String localFile, String remoteName, String remoteTargetDirectory, String mode) {
try {
connection.connect();
boolean isAuthed = isAuth();
if (isAuthed) {
SCPClient scpClient = connection.createSCPClient();
scpClient.put(localFile, remoteName, remoteTargetDirectory, mode);
} else {
logger.info("认证失败!");
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
connection.close();
}
}
public static void putFile(String localFile, String remoteTargetDirectory) {
try {
connection.connect();
boolean isAuthed = isAuth();
if (isAuthed) {
SCPClient scpClient = connection.createSCPClient();
scpClient.put(localFile, remoteTargetDirectory);
} else {
logger.info("认证失败!");
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
connection.close();
}
}
}
这里基本上就完事了,这里需要说明一下,由于项目需要,是在项目所在服务器B上保留一份图片,然后在A服务器上的图片库在进行保留,所以工作流程是先再服务器B上保存,然后推送至服务器A上。这里因为使用的是Spring Boot,内置tomcat存在文件大小的限制(2M?),所以要对文件大小进行设置。新建一个config配置文件类,使用@configeration进行注解,也可以直接写在Spring Boot的启动类下面,代码如下:
@Bean
public MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
//单个文件最大
factory.setMaxFileSize("10MB");//可以使M,KB
/// 设置总上传数据总大小
factory.setMaxRequestSize("100MB");可以使M,KB
return factory.createMultipartConfig();
}
如有不对,请大神不惜在下面留言,谢谢!