Прочитать все имена файлов из файла .rar в Node.js - PullRequest
0 голосов
/ 24 декабря 2018

У меня есть экспресс-маршрут, который загружает файлы, которые отправляются на сервер через 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') }
}

Вот как выглядит 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
}

Внутри filename.rar есть несколько файлов, таких как texture.png и info.txt.И моя цель - получить эти имена.

Ответы [ 4 ]

0 голосов
/ 04 января 2019

Шаги могут быть:

npm install -g node-rar

или

npm install node-rar

и

node-rar --version

в вашем файле:

var rar = require('node-rar');

/// list archive entries
rar.list('path/to/file.rar', 'optional password');
// => [entries]

/// test archive entries
rar.test('path/to/file.rar', 'dir/to/test', 'optional password');
// => [entries]

/// extract archive entries
rar.extract('path/to/file.rar', 'dir/to/extract', 'optional password');
// => [entries]
0 голосов
/ 28 декабря 2018

Вы можете использовать распаковывать , который принимает Buffer в качестве аргумента:

const Busboy = require('busboy');
const decompress = require('decompress');

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

            decompress(fileData, 'dist').then(files => {
                req.send(files.map(f => f.path))
            });
        })
        req.pipe(busboy)
    } catch (err) { return response.error(req, res, err, 'uploadProductFile_unexpected') }
}
0 голосов
/ 30 декабря 2018

В конце концов я нашел решение, используя 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') }
}
0 голосов
/ 25 декабря 2018

Использование: npm i node-rar

const rar = require('node-rar')

rar.list('path/to/file.rar', 'optional password')

Ссылка: https://www.npmjs.com/package/node-rar

...