从 Node.js 中的 .rar 文件中读取所有文件名

flo*_*olu 2 javascript rar archive winrar node.js

我有一条快速路线,可以上传文件,并通过formData.

假设文件是​​一个.rar文件,我的目标是提取此存档或其子文件夹中的所有文件名。

这是我的快递路线目前的样子:

module.exports = async (req, res) => {
    try {
        const busboy = new Busboy({ headers: req.headers })
        busboy.on('finish', async () => {
            const fileData = req.files.file
            console.log(fileData)
            // upload file
            // send back response
        })
        req.pipe(busboy)
    } catch (err) { return response.error(req, res, err, 'uploadProductFile_unexpected') }
}
Run Code Online (Sandbox Code Playgroud)

这是console.log(fileData)外观:

{
    data:
        <Buffer 52 61 72 21 1a 07 01 00 56 0c 22 93 0c 01 05 08 00 07 01 01 8d d6 8d 80 00 85 76 33 e4 49 02 03 0b fc d4 0d 04 b1 8c 1e 20 bc 86 da 2e 80 13
    00 2b 66 ... >,
    name: 'filename.rar',
    encoding: '7bit',
    mimetype: 'application/octet-stream',
    truncated: false,
    size: 224136
}
Run Code Online (Sandbox Code Playgroud)

里面filename.rar有一些文件,比如texture.pnginfo.txt。我的目标是获取这些名字。

flo*_*olu 5

我最终找到了一个使用node-unrar-js的解决方案:

const unrar = require('node-unrar-js')

module.exports = async (req, res) => {
    try {
        const busboy = new Busboy({ headers: req.headers })
        busboy.on('finish', async () => {

            const fileData = req.files.file
            const extractor = unrar.createExtractorFromData(fileData.data)
            const list = extractor.getFileList()
            if (list[0].state === 'SUCCESS')
                //  Here I have the file names
                const fileNmes = list[1].fileHeaders.map(header => header.name)
                // ...

        })
        req.pipe(busboy)
    } catch (err) { return response.error(req, res, err, 'uploadProductFile_unexpected') }
}
Run Code Online (Sandbox Code Playgroud)