遍历访问阿里云节点下的所有文件信息并写入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
                    // );
相关推荐
无名-CODING10 分钟前
Spring事务管理完全指南:从零到精通(上)
java·数据库·spring
fengxin_rou14 分钟前
【黑马点评实战篇|第一篇:基于Redis实现登录】
java·开发语言·数据库·redis·缓存
我待_JAVA_如初恋16 分钟前
Redis常用的数据类型之String
数据库·redis·缓存
@ chen18 分钟前
MySQL 中的锁机制
数据库·mysql
Elastic 中国社区官方博客23 分钟前
Elasticsearch:使用 Elastic Workflows 构建自动化
大数据·数据库·人工智能·elasticsearch·搜索引擎·自动化·全文检索
OnYoung27 分钟前
编写一个Python脚本自动下载壁纸
jvm·数据库·python
Apple_羊先森27 分钟前
ORACLE数据库巡检SQL脚本--15、表空间的运行状态
数据库·sql·oracle
数据与人1 小时前
ksql 元命令完整帮助
数据库·oracle
m0_581124191 小时前
Python日志记录(Logging)最佳实践
jvm·数据库·python
大黄说说1 小时前
打通异构数据库:PostgreSQL 通过 mysql_fdw 实现 MySQL 透明查询实战
数据库·mysql·postgresql