Как декодировать файл base64 при чтении из GridFS через Node?

Я пытаюсь прочитать файл, закодированный в 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));
});

Любые идеи?


person bicster    schedule 05.02.2020    source источник


Ответы (2)


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

   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);
        });
    });
person bicster    schedule 10.02.2020

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

Ex.

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

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

person Ahmed Hammad    schedule 05.02.2020
comment
Я смотрю на класс Buffer, но не могу понять, как перехватить данные, которые передаются из потока вывода GridFS в поток записи FS. Можете ли вы дать мне какие-нибудь указатели? - person bicster; 06.02.2020