URL下载文件及文件打包成压缩包并设置密码加密及通过SFTP上传到远程服务器
java实现URL下载文件并将下载的所有文件打包成压缩包,并对压缩包设置密码加密最后通过SFTP上传到远程服务器
废话不多说,直接上代码吧:
/**
* 文件推送
*
* @param chnlcode
* @param busnum
*/
@Override
public String electronicPolicyImagePush() {
StringBuilder msg = new StringBuilder();
LocalDate today = LocalDate.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
String formattedDate = today.format(formatter);
try {
LDSysvarSchema ftpInfo = ldSysvarMapper.getPrintFtpInfo(chnlcode);
List<String> policyList = puthMapper.findPolicyIssuedYesterday(chnlcode);
log.info("获取昨日数据号为: {}", policyList.toString());
if (policyList.isEmpty()) {
msg.append("无数据,推送结束....");
log.info("无数据,推送结束....");
return msg.toString();
}
List<PdfUrlDto> pdfUrls = puthMapper.findImageAddress(policyList);
List<PdfUrlDto> collect = pdfUrls.stream().filter(dto -> StringUtils.isNotBlank(dto.getUrl())).collect(Collectors.toList());
if(collect.isEmpty()){
msg.append("无数据,,推送结束....");
log.info("无数据,,推送结束....");
return msg.toString();
}
log.info("获取地址为: ");
collect.stream().map(url -> url.getUrl()).forEach(url -> log.info("url:{}", url));
log.info("开始pdf下载并转换成zip数据....");
//设置压缩包名称
String zipName = "MY" + formattedDate + ".zip";
String key = "MY" + formattedDate; // 实际的密钥
boolean result = downloadPdfFileToUploadToSFTP(collect, zipName, key, ftpInfo);
if (!result) {
msg.append("推送业务入失败-- ");
return msg.toString();
}
msg.append("推送业务成功-- ");
} catch (Exception e) {
log.info("推送业务入失败:{}", e.getMessage());
msg.append("推送业务入失败-- ");
}
return msg.toString();
}
/**
* pdf下载并转换成zip文件,上传数据到SFTP服务器
*
* @param pdfUrls
* @param zipName
* @param key
* @param ftp
*/
private boolean downloadPdfFileToUploadToSFTP(List<PdfUrlDto> pdfUrls, String zipName, String key, String text, String txtName, LDSysvarSchema ftp) {
List<File> downloadedFiles = new ArrayList<>();
Session session = null;
ChannelSftp channelSftp = null;
InputStream src = null;
try {
String tempDir = System.getProperty("java.io.tmpdir");
log.info("获取本地临时目录:{}", tempDir);
//第一步 下载pdf文件...
for (PdfUrlDto url : pdfUrls) {
URL pdfUrl = new URL(url.getUrl());
String serialNo = getSerialNo();
String pdfName = url.getContno() + '-' + serialNo + ".pdf";
URLConnection connection = pdfUrl.openConnection();
try (InputStream in = new BufferedInputStream(connection.getInputStream())) {
Path file = Paths.get(tempDir, pdfName);
Files.copy(in, file);
downloadedFiles.add(file.toFile());
}
log.info("将pdf名为:{},存入临时目录...", pdfName);
}
// 第二步 创建zip文件,并设置密码
ZipFile zipFile = new ZipFile(tempDir + '/' + zipName, key.toCharArray());
ZipParameters zipParameters = new ZipParameters();
zipParameters.setEncryptFiles(true);
zipParameters.setEncryptionMethod(EncryptionMethod.AES);
zipParameters.setAesKeyStrength(AesKeyStrength.KEY_STRENGTH_256);
log.info("创建压缩包名为:{} ,并设置密码", zipName);
//第三步 将下载的PDF文件添加到zip文件
zipFile.addFiles(downloadedFiles, zipParameters);
log.info("pdf下载完成并全部存入{}压缩包成功...", zipFile.getFile().toString());
//第四步 上传数据到SFTP服务器
src = new FileInputStream(zipFile.getFile());
JSch jsch = new JSch();
session = jsch.getSession(ftp.getFtpUsername(), ftp.getFtpIp(), Integer.parseInt(ftp.getFtpPort()));
session.setPassword(ftp.getFtpPassword());
session.setConfig("StrictHostKeyChecking", "no");
session.connect();
channelSftp = (ChannelSftp) session.openChannel("sftp");
channelSftp.connect();
log.info("开始上传数据到SFTP服务器...");
LocalDate today = LocalDate.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
String formattedDate = today.format(formatter);
String remoteFilePath = '/' + ftp.getFtpBasePath() + '/' + ftp.getFtpPath() + '/' + formattedDate;
// 删除原先目录
// if(channelSftp.stat(remoteFilePath).isDir()){
// channelSftp.rm(remoteFilePath + "/*");
// channelSftp.rmdir(remoteFilePath);
// }
//没有目录再创建
try {
channelSftp.stat(remoteFilePath);
} catch (SftpException e) {
if (e.id == ChannelSftp.SSH_FX_NO_SUCH_FILE) {
channelSftp.mkdir(remoteFilePath);
log.info("创建远程目录成功...");
} else {
throw e;
}
}
channelSftp.put(src, remoteFilePath + '/' + zipName);
log.info("上传压缩包及txt文件到SFTP服务器成功....");
//第五步 删除临时文件
downloadedFiles.add(zipFile.getFile());
for (File file : downloadedFiles) {
file.delete();
}
log.info("删除临时目录文件成功....");
return true;
} catch (IOException | JSchException | SftpException e) {
log.info("pdf下载并转换成zip文件失败:{}", e.getStackTrace());
return false;
} finally {
if (channelSftp != null) {
channelSftp.disconnect();
}
if (session != null) {
session.disconnect();
}
try {
if (src != null) {
src.close();
}
} catch (IOException e) {
log.info(e.getMessage());
}
}
}
}
主要实现是在downloadPdfFileToUploadToSFTP方法中:
这个方法实现了一个包含多个步骤的文件处理逻辑。首先,它将加密文件保存在临时目录中,并创建一个文件输入流以便后续操作。接着,利用JSch库建立SFTP会话,并将数据上传到SFTP服务器。在上传过程中,方法会根据需要创建远程目录,并将文件放置在指定的路径下。然后,方法会将临时文件(包括txt文件和zip文件)删除,以确保不会留下不必要的临时文件。
在整个方法的执行过程中,会捕获可能发生的IOException、JSchException和SftpException异常,并在发生异常时打印错误日志并返回false,表明操作未能成功完成。最后,无论是否发生异常,方法都会关闭SFTP通道和会话,并关闭文件输入流和写入器,以确保资源得到释放。
这个方法的最终目的是将加密文件成功地上传到SFTP服务器,并在完成上传后进行相应的清理工作
最后猜猜这是哪个动漫? qwq