FTP-读取指定目录下的文件,上传到FTP服务器,一键复制黏贴,就是这么丝滑~

news2025/2/21 23:31:47

背景:需要定时将服务器下的日志文件上传到指定FTP服务器的目录下,并通知第三方平台文件已上传。

FTP服务器模拟工具:

 application.yml配置:

spring:
  logfilepath: /home/jboss/server/default/log
  # ftp配置
  ftp:
    ip: 192.*****
    port: 21
    username: root
    password: 123456
    path: /FtpRoot/ZZDT12/
    subsystem: CCTV/
  # 智能运维平台配置
  znyw:
    # ftp文件上传后通知智能运维系统地址
    filestatusurl: http://***:7000/imaster/log/upload
    # 日志文件每天 23 点 58 分执行上传、通知智能运维平台一次
    scan: "0 58 23 * * ?"
    # 线路编码
    lineid: 12
    # 子系统编码
    subsystemid: 10
  servlet:
    multipart:
      enabled: true
      # 根据实际需求作调整
      max-file-size: -1
      max-request-size: -1

定时任务:

import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.vcom.nms.service.IFileUploadService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.List;

/**
 * 运维对接-日志文件上报接口
 */
@Configuration
public class LogFilePushTask extends BaseTask {

    private static final Logger logger = LoggerFactory.getLogger(LogFilePushTask.class);

    @Autowired
    private IFileUploadService fileUploadService;

    @Value("${spring.logfilepath}")
    private String SYS_LOG_FILE_PATH;

    /**
     * 日志文件每天 23 点 58 分执行上传、通知智能运维平台一次
     */
    @Scheduled(cron = "${spring.znyw.scan}")
    private void fileUploadTask() {
        logger.info("============come in fileUploadTask============");
        List<MultipartFile> multipartFileList = new ArrayList<>();
        try {
            multipartFileList = getFilesAsMultipart(SYS_LOG_FILE_PATH);
        } catch (IOException e) {
            logger.error("io Exc:", e);
        } catch (Exception e) {
            logger.error("Exc:", e);
        }
        logger.info("此次上传文件共:" + multipartFileList.size());
        multipartFileList.forEach(file -> {
            String fileName = fileUploadService.uploadFileAndNotice(file);
            if (StringUtils.isNotBlank(fileName)) {
                logger.info("成功上传日志文件:" + fileName);
            }
        });
    }

    public static List<MultipartFile> getFilesAsMultipart(String directoryPath) throws IOException {
        List<MultipartFile> multipartFiles = new ArrayList<>();
        File directory = new File(directoryPath);
        File[] files = directory.listFiles();
        for (File file : files) {
            multipartFiles.add(convertToMultipart(file));
        }
        return multipartFiles;
    }

    private static MultipartFile convertToMultipart(File file) throws IOException {
        byte[] fileContent = Files.readAllBytes(file.toPath());
        return new MockMultipartFile(file.getName(), file.getName(), "text/plain", fileContent);
    }

}

接口类:

import org.springframework.web.multipart.MultipartFile;

import java.util.List;

public interface IFileUploadService {
    /**
     * @Description:  上传文件到ftp服务器并通知智能运维平台
     * @param file
     * @return:
     * @Author: hyh
     * @Date: 2023/4/19 9:19
     */
    String uploadFileAndNotice(MultipartFile file);

    /**
     * @Description:  通知智能运维平台文件上传
     * @param fileName
     * @return:
     * @Author: hyh
     * @Date: 2023/4/19 11:13
     */
    void noticZnywFileStatus(String fileName);

    /**
     * @Description:  根据文件名称查看是否成功上传
     * @param fileName
     * @return:
     * @Author: hyh
     * @Date: 2023/4/19 13:28
     */
    List getFileNameList(String fileName);
}

接口实现类:

import java.io.IOException;
import java.io.InputStream;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

@Service
public class FileUploadServiceImpl implements IFileUploadService {
    private static final Logger logger = LoggerFactory.getLogger(FileUploadServiceImpl.class);

    @Autowired
    private final FtpUtil ftpUtil;
    @Value("${spring.ftp.path}")
    private String FTP_ROOT_DIR;
    @Value("${spring.ftp.subsystem}")
    private String SUBSYSTEM_NAME;
    @Value("${spring.znyw.filestatusurl}")
    private String ZNYW_FILE_STATUS_URL;
    @Value("${spring.znyw.lineid}")
    private int ZNYW_LINEID;
    @Value("${spring.znyw.subsystemid}")
    private int ZNYW_SUBSYSTEMID;

    private FileUploadServiceImpl(FtpUtil ftpUtil) {
        this.ftpUtil = ftpUtil;
    }

    @Override
    public String uploadFileAndNotice(MultipartFile file) {
        if (!ftpUtil.checkFileSize(file.getSize(), 100, "M")) {
            logger.warn("文件{}大小超过100MB,不予上传!", file.getOriginalFilename());
            return null;
        }
        String fileName = "";
        try {
            // 读取文件信息
            String name = file.getOriginalFilename();
            InputStream fileInputStream = file.getInputStream();
            //年月日
            LocalDate date = LocalDate.now();
            DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("yyyyMMdd");
            DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy_MM_dd");
            fileName = date.format(formatter2) + "_" + name;
            // 上传文件到 Ftp 服务
            boolean flag = ftpUtil.upload(FTP_ROOT_DIR + SUBSYSTEM_NAME + date.format(formatter1), fileName, fileInputStream);
            //通知智能运维平台
            if (!(flag && syncMsgToZnywPlatform(fileName))) {
                logger.error(flag + ":{}文件上传失败!", file.getOriginalFilename());
                return null;
            }
        } catch (IOException e) {
            logger.error("文件上传失败!", String.valueOf(e));
        }
        return fileName;
    }

    @Override
    public void noticZnywFileStatus(String fileName) {
        syncMsgToZnywPlatform(fileName);
    }

    @Override
    public List getFileNameList(String fileName) {
        Pattern pattern = Pattern.compile("\\d{4}_\\d{2}_\\d{2}");
        Matcher matcher = pattern.matcher(fileName);
        String directory = "";
        if (matcher.find()) {
            directory = matcher.group().replace("_", "");
        } else {
            throw new RuntimeException("文件名称格式不正确!");
        }
        String path = FTP_ROOT_DIR + SUBSYSTEM_NAME + directory;
        return ftpUtil.getFileNameList(path);
    }

    //同步ftp文件上传信息到智能运维平台
    public boolean syncMsgToZnywPlatform(String fileName) {
        Response response = null;
        long timestamp = System.currentTimeMillis();
        try {
            OkHttpClient client = new OkHttpClient().newBuilder()
                    .connectTimeout(15, TimeUnit.SECONDS)
                    .readTimeout(15, TimeUnit.SECONDS)
                    .writeTimeout(15, TimeUnit.SECONDS)
                    .build();
            MediaType mediaType = MediaType.parse("text/plain");
            RequestBody body = RequestBody.create(mediaType, "");
            Request request = new Request.Builder()
                    .url(ZNYW_FILE_STATUS_URL + "?lineId=" + ZNYW_LINEID + "&systemId=" + ZNYW_SUBSYSTEMID + "&fileName=" + fileName)
                    .method("POST", body)
                    .addHeader("Content-Type", "application/json")
                    .build();
            response = client.newCall(request).execute();
            if (response.isSuccessful()) {
                String res = response.body().string();
                logger.info("操作:通知智能运维系统,请求客户端返回信息:{}", res);
                return true;
            }
        } catch (Exception e) {
            logger.error("IOException={}", e.getMessage());
            return false;
        } finally {
            if (null != response) {
                response.close();
            }
            logger.info("fileStatusUpload_time:" + (System.currentTimeMillis() - timestamp));
        }
        return false;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/702592.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ChatGLM-6B部署、实战与微调

文章目录 摘要下载chatglm-6b下载模型文件推理代码调用网页版的Demo网页版的Demo2命令行 Demo 部署API部署低成本部署模型量化CPU 部署Mac 部署多卡部署 训练与微调软件依赖下载数据集训练P-Tuning v2评估P-Tuning v2训练的模型部署P-Tuning v2训练的模型量化全参数Finetune 训…

回归预测 | MATLAB实现PSO-CNN粒子群算法优化卷积神经网络的数据多输入单输出回归预测

回归预测 | MATLAB实现PSO-CNN粒子群算法优化卷积神经网络的数据多输入单输出回归预测 目录 回归预测 | MATLAB实现PSO-CNN粒子群算法优化卷积神经网络的数据多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 回归预测 | MATLAB实现PSO-CNN粒子群算法优…

计算机网络 套接字函数 | socket、bind、listen、accept、connect

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

红外雨量计(光学雨量传感器)在船舶航行中的应用

红外雨量计&#xff08;光学雨量传感器&#xff09;在船舶航行中的应用 红外雨量计是一种可靠的测量降雨量的设备&#xff0c;其原理是利用红外线的反射和漏射来测量降雨量。在船舶航行中&#xff0c;降雨对航行和安全都具有重要影响&#xff0c;因此红外雨量计的应用可以提高…

Linux 内核源代码情景分析(二)

系列文章目录 Linux 内核设计与实现 深入理解 Linux 内核 Linux 设备驱动程序 Linux设备驱动开发详解 深入理解Linux虚拟内存管理 Linux 内核源代码情景分析&#xff08;一&#xff09; Linux 内核源代码情景分析&#xff08;二&#xff09; 文章目录 系列文章目录第 4 章 进程…

如何获取科技项目验收测试报告,有什么作用?

科技项目验收测试报告是科技项目验收的重要文件&#xff0c;它对项目的开发过程和测试结果进行了全面的总结和评估。获取科技项目验收测试报告可以帮助项目组了解项目的测试情况和可靠性&#xff0c;从而对项目的质量进行评估和提升。本文将介绍如何获取科技项目验收测试报告&a…

el-table花式操作,含合并求和、双表齐动 等等

1.指定行单元格&#xff0c;合并求和 el-table&#xff0c;提供的行合并&#xff0c;我是没找到单元格可以合并求和的&#xff0c;就用了操作document来 合并单元格&#xff0c;大家可以参考参考 上面这张表&#xff0c;第1 2 两行&#xff0c;数据是一样的&#xff0c;3 4 两…

ES架构原理分析

节点职责 节点按照职责可以分为&#xff1a; master节点数据节点协调节点 节点类型可以进行单独配置。默认情况下&#xff0c;集群不会对节点角色进行划分&#xff0c;所有节点都是平等的&#xff0c;可以担任所有的职责。但是在生产环境中需要对这些节点的角色进行最优划分…

HAL库记录-SDIO外设SD卡

正点原子--阿波罗开发板STM32F429IGT6 1.STM32CubeMX配置 2.生成的代码 /*** Enable DMA controller clock*/ void MX_DMA_Init(void) {/* DMA controller clock enable */__HAL_RCC_DMA2_CLK_ENABLE();/* DMA interrupt init *//* DMA2_Stream3_IRQn interrupt configuratio…

CSS差缺补漏之《高频面试题----如何使元素水平垂直居中?》

面试中经常会被问到如何使元素水平垂直居中&#xff0c;有哪些方法可以做到&#xff1f; 针对此问题&#xff0c;特意总结如下~ 方法一&#xff1a; 定位&#xff08;主要是值子绝父相&#xff09;与margin负值配合----依赖于子元素宽/高 (使用绝对定位或固定定位后&#xff0c…

GitLab无法提交大文件的问题

GitLab无法提交大文件的问题 问题描述 GitLab 当提交大文件时遇到如下报错 MYOPS001MYOPS001 MINGW64 /e/work/GitLab/system-deploy (main) $ git push Enumerating objects: 91, done. Counting objects: 100% (91/91), done. Delta compression using up to 16 threads C…

ARM-异常中断处理概述(五)

文章目录 控制程序执行流程ARM 体系中异常中断种类 控制程序执行流程 在 ARM 体系中通常有以下 3 种方式控制程序的执行流程&#xff1a; 在正常程序中执行过程中&#xff0c;每执行一条 ARM 指令&#xff0c;程序计数寄存器 PC 的值加 4 个字节&#xff1b;每执行一条 Thumb…

Python车道线识别

最近找了一款车道线识别的代码&#xff0c;可以准确识别出车道线&#xff0c;里面的视频路径可以切换为自己的视频&#xff0c;现在我以自带的视频数据展示效果 图片中可以准确识别车的车道线&#xff1a; 下面给出一部分源代码&#xff1a; import cv2 import numpy as np i…

汽车统一bootloaderv2.0版本 翻译

统一bootloader系统 统一bootloader范围 下图展示了PC通过适配器与ECU连接。高亮公布部分是ECU和PC共同的。所有平台都是一样的。 统一bootloader关键特征 UDS(ISO14229)TP(ISO1765-2/CAN,ISO17987-2/LIN)Flash驱动包括共同的要求从主机下载Flash驱动bootloader检测APP完整…

元宇宙赋能数字文创 | 蓝海创意云受邀发表瑶海区文化创意产业数字化高峰论坛主题演讲

2023年6月29日&#xff0c;在合肥市文化旅游局的指导下&#xff0c;由中共合肥市瑶海区委员会和合肥市瑶海区人民政府主办的“2023瑶海文化创意产业数字化高峰论坛”于合肥市长江180艺术街区召开&#xff0c;本次论坛以“传承创新&#xff0c;数字引领”为主题&#xff0c;探索…

uniapp项目 完成一个点击 展开 收起的效果

需求是: 即将解锁勋章模块 默认只展示三条数据,当数据大于3条时显示展开,点击展开显示全部数据,展开按钮变为收起,点击收起就只展示三条数据,且收起按钮变为展开. 小于或等于3条时显示所有数据,且不显示展开收起, <view class"unlock"><view style&quo…

Modbus协议学习方法

在刚开始接触modbus协议的时候&#xff0c;很容易被里面的各种功能码搞晕&#xff0c;同时在编写程序的时候也容易搞不清楚每一位数据代表的含义。如果在学习的过程中有实际的发送和接收数据的例子话&#xff0c;那么理解modbus协议就会更容易一些。   下面我将自己借助软件学…

3.0C++虚函数

C 虚函数 C的虚函数是一种特殊的成员函数&#xff0c;可以在派生类中被重写。 虚函数的作用是实现多态性&#xff0c;当我们使用基类指针或引用来调用虚函数时&#xff0c;程序会根据实际的对象类型来调用相应的派生类函数。 我们可以将一个成员函数声明为虚函数&#xff0c…

C++primer(第五版)第六章(函数)

6.1函数基础 函数可以理解成是可以循环使用的代码块.函数的定义通常包含以下部分:返回类型,函数名称,参数列表,函数体. //以下是一个返回值为int类型,有两个参数的函数的定义 int add(int a,int b){return ab; }我们用调用运算符( )来执行函数,在运算符内传入参数.调用时会打…

如何确保大模型追求“正确”的目标?丨AI安全与对齐圆桌回顾

导读 在智源大会「AI 安全与对齐」论坛上&#xff0c;与会嘉宾针对目前人们关心的 AI 安全控制标准、多智能体强化学习环境下的安全、开源对 AI 安全的影响、对智能涌现安全的思考等问题展开了讨论。 能力越大&#xff0c;责任越大。 嘉宾名单 谢旻希丨主持人&#xff0c;安远A…