背景:
近期,因客户需要,我们需要将一些文件从阿里云的oss上复制到客户提供的ftp上,但是客户提供的ftp的证书早就过期了,用正常ftp登陆代码一直登陆超时,同事找了几天都没有解决,后来解决了,我也顺便看了一下代码,因为之前只写过https跳过ssl证书的代码,ftp也是首次碰到,下面贴下代码,防止更多道友踩坑,主要代码如下:
try {
// 创建OSSClient实例。
ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// ossObject包含文件所在的存储空间名称、文件名称、文件元信息以及一个输入流。
OSSObject ossObject = ossClient.getObject(bucketName, objectName);
// 读取文件内容。
InputStream is = ossObject.getObjectContent();
//创建SSL上下文
SSLContext sslContext = SSLContext.getInstance("TLS");
//自定义证书,忽略已过期证书
TrustManager[] trustAllCerts = new TrustManager[1];
TrustManager tm = new miTM();
trustAllCerts[0] = tm;
//初始化
sslContext.init(null, trustAllCerts, null);
//创建客户端,加密选择Implicit
ftpClient = new FTPSClient(true, sslContext);
//连接ftp
ftpClient.connect(hostname, Integer.parseInt(port));
//登陆ftp
ftpClient.login(username, password);
//创建文件夹
ftpClient.makeDirectory("/" + meetingNo);
//需要把文件上传到FTP哪个目录
ftpClient.changeWorkingDirectory("/" + meetingNo);
ftpClient.enterLocalPassiveMode();
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
ftpClient.execPBSZ(0);
ftpClient.execPROT("P");
//上传图片
for (MeetingTaskWechatPhoto meetingTaskWechatPhoto : meetingTaskWechatPhotos) {
String photoUrl = meetingTaskWechatPhoto.getPhoto_url();
String[] split = StringUtils.split(photoUrl, "/");
String pictureName = split[split.length - 1];
//存储文件,成功返回true,失败false
//以二进制形式传输
if (ftpClient.storeFile(pictureName, is)) {
log.info(pictureName + "上传成功");
} else {
log.info(pictureName + "上传失败");
}
}
//断开连接
ftpClient.disconnect();
// 数据读取完成后,获取的流必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。
is.close();
// 关闭OSSClient。
ossClient.shutdown();
} catch (Exception e) {
e.printStackTrace();
log.error("文件同步失败!");
}
}
static class miTM implements TrustManager, X509TrustManager {
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public boolean isServerTrusted(X509Certificate[] certs) {
return true;
}
public boolean isClientTrusted(X509Certificate[] certs) {
return true;
}
public void checkServerTrusted(X509Certificate[] certs, String authType)
throws CertificateException {
return;
}
public void checkClientTrusted(X509Certificate[] certs, String authType)
throws CertificateException {
return;
}
}
一些配置换成你们的ftp和oss的相关参数即可
踩坑之路越踩才能走的越远。
革命尚未成功,同志仍需努力,加油!!!