4.7 minio下载文件代码优化

本文介绍了一个基于Node.js的MinIO文件下载系统配置及其实现细节。系统通过特定的配置参数,如文件名截取规则、文件类型筛选等,实现从MinIO存储桶中按需下载文件的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、config.js

module.exports = {
    //这里不能带http或者https
    endPoint: 'minio-spider-images.lan',
    port: 9000,
    useSSL: false, //不需要https
    accessKey: 'G2ga7dnJxg7M24C8',
    secretKey: 'ch7by1y17ytbXZOowW9PMz2lF69mzElX'
}
/**
 * @description split_range:截取源文件的名称,作为下载后的文件名称,可以为空或者两个数字,两个数字的长度不能超过源文件的名称的长度
 * @description download_ext:需要下载的文件后缀
 * @description file_path:下载后的文件存储的目录
 * @description exclude_ext:需要排除下载的文件格式,与download_ext冲突,两者只能存在一个有值
 * @description bucket:mio中需要下载的bucketname,不能为空
 * @description prefix:mio中bucketname下一级目录,为空则表示所有
 * example:
 * split_range:[1,10] 表示从前截取1位,从后截取10位,拼接成下载后文件的名称
 * download_ext:['.json','.docx'] 表示需要下载json格式和docx格式的文件,与exclude_ext冲突,仅可有一个字段有值,或者都为空,为空则下载所有
 * file_path:'/temp/download' 表示下载后的文件存储的在/temp/download位置,如果没有该目录,则会新建
 * exclude_ext:['.docx'] 表示下载非docx格式的文件,与download_ext冲突,仅可有一个字段有值,或者都为空,为空则下载所有
 * bucket:'fileinspection' 表示从mio的名称为fileinspection的buckets中下载文件
 * @type {{bucket: string, file_path: string, split_range: *[], download_ext: string[], prefix: string, exclude_ext: *[]}}
 */
module.exports.setting = {
    split_range: [],
    download_ext: [],
    file_path: '/temp000/hello/',
    exclude_ext: ['.txt'],
    bucket:'file',
    prefix:''
}

2、run.js

const config = require('./config')
const Minio = require('minio')

let connect = (config, client) => {
    return new Promise((resolve, reject) => {
        let bucket_name = null
        client.listBuckets(function (err, buckets) {
            if (err) return console.log(err)
            for (let i in buckets) {
                if (buckets.hasOwnProperty(i)) {
                    if (config.setting.bucket !== '') {
                        if (buckets[i]['name'] === `${config.setting.bucket}`) {
                            bucket_name = buckets[i]['name']
                            break
                        }
                    } else {
                        throw new Error("the value of [config.setting.bucket] can't be empty")
                    }
                }
            }
            resolve(bucket_name)
        })
    })
}
let listObject = (bucket_name, prefix, client) => {
    return new Promise((resolve, reject) => {
        let list = []
        let stream = client.listObjectsV2(`${bucket_name}`, prefix, true, '')
        stream.on('data', function (obj) {
            list.push(obj)
        })
        stream.on('error', function (err) {
            console.log(err)
        })
        stream.on('end', function (obj) {
            resolve(list)
        })
    })
}

let download = (bucket_name, object_name, path, client) => {
    return new Promise((resolve, reject) => {
        client.fGetObject(bucket_name, object_name, path, function (err) {
            if (err) {
                return console.log(err)
            }
            console.log(`downloading ${object_name}`)
            resolve('success')
        })
    })
}
(async () => {
    let s3Client = new Minio.Client(config);
    let bucket = await connect(config, s3Client)
    let list = await listObject(bucket, config.setting.prefix, s3Client)
    for (let i of list) {
        let length = i['name'].length;
        let start;
        let end;
        if (config.setting.split_range.length === 0) {
            start = 0;
            end = 0
        } else {
            start = config.setting.split_range[0];
            end = config.setting.split_range[1];
        }
        if (start > length || end > length) {
            throw new Error('the value of config.setting.split_range exceeds the length of filename')
        }
        let filepath = config.setting.file_path;
        if (config.setting.download_ext.length !== 0) {
            for (let j in config.setting.download_ext) {
                if (config.setting.download_ext.hasOwnProperty(j)) {
                    if (i['name'].endsWith(config.setting.download_ext[j])) {
                        await download(bucket, i['name'], `${filepath}${i['name'].slice(0, start)}${i['name'].slice(-end)}`, s3Client)
                    }
                }
            }
        } else if (config.setting.download_ext.length === 0 && config.setting.exclude_ext.length !== 0) {
            for (let j in config.setting.exclude_ext) {
                if (config.setting.exclude_ext.hasOwnProperty(j)) {
                    if (!i['name'].endsWith(config.setting.exclude_ext[j])) {
                        await download(bucket, i['name'], `${filepath}${i['name'].slice(0, start)}${i['name'].slice(-end)}`, s3Client)
                    }

                }

            }
        } else if (config.setting.download_ext.length === 0 && config.setting.exclude_ext.length === 0) {
            await download(bucket, i['name'], `${filepath}${i['name'].slice(0, start)}${i['name'].slice(-end)}`, s3Client)
        } else {
            throw new Error('one of config.setting.download_ext and config.setting.exclude_ext must be empty')
        }
    }
})()


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值