遍历访问阿里云节点下的所有文件信息并写入excel文件

后台系统用的久了,由于图片替换和删除导致阿里云上存在大量系统不在使用的图片。阿里是按照所有图片和视频等文件总容量以及下载流量收费的。所以这些不用的图片和视频需要定期清理。

遍历访问阿里云节点下的所有文件信息,并写入excel文件(阿里云文件数据表)。从阿里云中查到的图片文件地址都是http://开头的,要替换成https://开头的.

导入头文件和静态变量

复制代码
const FspConstant = require('@app/tools/fsp_constant.js');
const Tool = require('@app/tools/common_tool.js');
const msgCode = require('@app/config/error_config.js');
const Excel = require('exceljs');
const fs = require('fs');
const path = require('path');
const https = require('https');
const OSS = require('ali-oss');
const ossHZ = new OSS({
    region: 'oss-cn-hangzhou',
    accessKeyId: FspConstant.ACCESS_KEY_ID,
    accessKeySecret: FspConstant.ACCESS_KEY_SECRET,
    bucket: '具体的bucket名称',
});

实现代码:

复制代码
//获取阿里云节点下除了wx-test目录及子目录文件的所有文件
DeleteRepeatImageVideoTool.getAllFileUrlsWithPagination = async function(prefix = '') {
    const allFiles = [];
    let marker = null;
    // 定义要忽略的文件夹列表
    const ignoreFolders = [ 'wx-test'];

    try {
        do {
            const result = await ossHZ.list({
                prefix: prefix,
                delimiter: '/',
                'max-keys': 1000,
                marker: marker
            }, {});

            // 处理文件 - 过滤掉目录
            if (result.objects) {
                for (const object of result.objects) {
                    // 只处理真正的文件,不处理目录
                    if (!object.name.endsWith('/') && object.size > 0) {
                        let url = ossHZ.generateObjectUrl(object.name);
                        url = url.replace('http://fangsuanpan.oss-cn-hangzhou.aliyuncs.com/', 'https://fangsuanpan.oss-cn-hangzhou.aliyuncs.com/');
                        // 提取根目录
                        let rootDir = '';
                        const firstSlashIndex = object.name.indexOf('/');
                        if (firstSlashIndex !== -1) {
                            rootDir = object.name.substring(0, firstSlashIndex);
                        } else {
                            // 如果没有斜杠,说明文件在根目录下
                            rootDir = 'root';
                        }
                        allFiles.push({
                            name: object.name,
                            url: url,
                            size: object.size,
                            lastModified: object.lastModified,
                            type: object.type,
                            dir: rootDir
                        });
                    }
                }
            }

            // 递归处理子目录
            if (result.prefixes) {
                for (const subPrefix of result.prefixes) {
                    // 检查是否在忽略列表中
                    const shouldIgnore = ignoreFolders.some(folder => 
                        subPrefix.startsWith(folder + '/') || subPrefix === folder
                    );
                    
                    if (shouldIgnore) {
                        console.log(`忽略文件夹: ${subPrefix}`);
                        continue; // 跳过这个文件夹
                    }
                    
                    console.log(`遍历子目录: ${subPrefix}`);
                    const subFiles = await this.getAllFileUrlsWithPagination(subPrefix);
                    // 确保subFiles是数组
                    if (Array.isArray(subFiles)) {
                        allFiles.push(...subFiles);
                    } else if (subFiles && Array.isArray(subFiles.allFiles)) {
                        allFiles.push(...subFiles.allFiles);
                    }
                    // console.log(`遍历子目录: ${subPrefix}`);
                    // const subFiles = await this.getAllFileUrlsWithPagination(subPrefix);
                    // // 确保subFiles是数组
                    // if (Array.isArray(subFiles)) {
                    //     allFiles.push(...subFiles);
                    // } else if (subFiles && Array.isArray(subFiles.allFiles)) {
                    //     allFiles.push(...subFiles.allFiles);
                    // }
                }
            }

            marker = result.nextMarker;
            console.log(`已找到 ${allFiles.length} 个文件,继续标记: ${marker}`);
            // break;    
        } while (marker);

        // 如果是顶层调用,生成Excel;否则返回文件数组
        if (prefix === '') {
            if(Tool.checkNotEmptArray(allFiles)){
                let excel = Tool.makeExcel(allFiles, ['name', 'url', 'size','lastModified', 'type', 'dir'], {
                    name: '文件路径',
                    url: '文件地址',
                    size: '文件大小',
                    lastModified: '最后修改时间',
                    type: '类型',
                    dir: '根目录' 
                });
                return {excel, fileCount: allFiles.length};
            }else{
                return {fileCount: 0};
            }
        } else {
            // 递归调用返回文件数组
            return allFiles;
        }
    } catch (error) {
        console.error('分页遍历失败:', error);
        throw msgCode[39522]('获取图片列表');
    }
};

若遍历并写入所有文件信息到excel这部分代码修改为这样:

复制代码
                    const shouldIgnore = false;
                    // ignoreFolders.some(folder => 
                    //     subPrefix.startsWith(folder + '/') || subPrefix === folder
                    // );
相关推荐
小光学长2 小时前
基于Web的课前问题导入系统pn8lj4ii(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
java·前端·数据库
EasyCVR2 小时前
视频汇聚平台EasyCVR:构建通信基站“可视、可管、可控”的智慧安防体系
服务器·数据库·音视频
q***69772 小时前
Spring boot启动原理及相关组件
数据库·spring boot·后端
月屯3 小时前
平台消息推送(go)
数据库·后端·golang·cocoa·iphone·gin
mudtools3 小时前
.NET驾驭Excel之力:Excel应用程序的创建与管理
c#·.net·excel·wps
superlls3 小时前
(Mysql)Mysql八股大杂烩
数据库·sql
張萠飛3 小时前
Phoenix+Hbase和Doris两个方案如何选择,能不能拿Doris完全替代Phoenix+Hbase?有什么难点?
大数据·数据库·hbase
mudtools3 小时前
.NET驾驭Excel之力:自动化数据处理 - 开篇概述与环境准备
c#·自动化·.net·excel·wps
cx330上的猫3 小时前
【数据分析-Excel】常用函数汇总
数据分析·excel