遍历访问阿里云节点下的所有文件信息并写入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// );
