Как декодировать файл base64 при чтении из GridFS через Node? - PullRequest
0 голосов
/ 06 февраля 2020

Я пытаюсь прочитать файл, закодированный в base64, из коллекции MongoDB GridFS, используя Node. Мне удалось сохранить файл, сохраненный из MongoDB, на мой локальный компьютер, но он в формате base64, и я хочу сохранить его в незашифрованном виде.

В идеале я хотел бы декодировать файл «на лету» без необходимости сохранять один раз, чтобы затем прочитать> декодировать> записать его обратно в файловую систему.

Мой код в настоящее время выглядит следующим образом ...

return new Promise(async (resolve, reject) => {
    let bucket = new mongodb.GridFSBucket(db, {bucketName: 'Binaries'});
    let objectID = new mongodb.ObjectID(fileID);

    // create the download stream
    bucket.openDownloadStream(objectID)
        .once('error', async (error) => {
            reject(error);
        })
        .once('end', async () => {
            resolve(downloadPath);
        })
        // pipe the file to the stream
        .pipe(fs.createWriteStream(downloadPath));
});

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 11 февраля 2020

На всякий случай, если кто-то еще смотрит на это, вот где я приземлился ...

   return new Promise(async (resolve, reject) => {
        let bucket = new mongodb.GridFSBucket(db, {
            bucketName: 'Binaries'
        });
        let objectID = new mongodb.ObjectID(fileInformation._id);

        // temporary variable to hold image
        var data = [];

        // create the download stream
        let downloadStream = bucket.openDownloadStream(objectID);
        downloadStream.on('data', (chunk) => {
            data.push(chunk);
        });
        downloadStream.on('error', async (error) => {
            reject(error);
        });
        downloadStream.on('end', async () => {
            // convert from base64 and write to file system
            let bufferBase64 = Buffer.concat(data)
            let bufferDecoded = Buffer.from(bufferBase64.toString(), 'base64');
            fs.writeFileSync(fileName, bufferDecoded, 'binary');
            resolve(fileName);
        });
    });
0 голосов
/ 06 февраля 2020

Узел имеет встроенный синтаксический анализатор буфера Buffer.from(string[, encoding]), с помощью которого вы можете передать ему закодированную строку base64 и получить поток байтов с другой стороны, который впоследствии можно будет легко преобразовать .toString().

Ex.

let whatYouNeed = Buffer.from(gridFsData, 'base64').toString();

Подробнее о функции Buffer.from () здесь .

...