遍历访问阿里云节点下的所有文件信息并写入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
                    // );
相关推荐
秋风渡.1 分钟前
MySQL_数据类型知识
数据库·mysql
Season45034 分钟前
Redis命令 (generic即通用命令)
数据库·redis·bootstrap
liwulin05061 小时前
【ollama】自定义结构化输出
linux·前端·数据库·ollama
木易士心2 小时前
MyBatis数据源切换全面解析
数据库
新中地GIS开发老师2 小时前
地信职业百科④:GIS开发工程师
前端·数据库·gis·webgis·三维gis开发
云和恩墨2 小时前
从“第二存储”到多智能体协作,云和恩墨充实数据基础设施产品矩阵
数据库
ClouGence2 小时前
SAP HANA 到 Doris 数据迁移:4 种方案对比与迁移教程
数据库·后端·dba
霸道流氓气质2 小时前
ApiPost 中配置自动获取 Token 并调用业务接口完整指南
java·服务器·数据库
我不想名字重复2 小时前
redis缓存和数据库数据保持一致
数据库·redis·缓存
宇宙第一小趴菜2 小时前
三、Oracle 核心原理
数据库·oracle