遍历访问阿里云节点下的所有文件信息并写入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
                    // );
相关推荐
MeAT ITEM6 小时前
MySQL Workbench菜单汉化为中文
android·数据库·mysql
dovens6 小时前
PostgreSQL 中进行数据导入和导出
大数据·数据库·postgresql
IOT.FIVE.NO.16 小时前
claude code desktop cowork报错解决和记录Workspace..The isolated Linux environment ...
linux·服务器·数据库
Rick19936 小时前
mysql 慢查询怎么快速定位
android·数据库·mysql
科技小花13 小时前
全球化深水区,数据治理成为企业出海 “核心竞争力”
大数据·数据库·人工智能·数据治理·数据中台·全球化
X566114 小时前
如何在 Laravel 中正确保存嵌套动态表单数据(主服务与子服务)
jvm·数据库·python
虹科网络安全16 小时前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
2301_7717172116 小时前
解决mysql报错:1406, Data too long for column
android·数据库·mysql
小江的记录本16 小时前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka
dvjr cloi16 小时前
MySQL Workbench菜单汉化为中文
android·数据库·mysql