js.writeFile не правильно пишет Blob

У меня есть сервис Angular с функцией записи файлов. Функция может работать на платформе Ionic или Electron. Для Ionic он использует $cordovaFile для действий с файлами, а для Electron - библиотеку node fs.

Функция выглядит следующим образом:

writeFile(filename: string, dirname: string, data: string | Blob, replace?: boolean): ngCordova.IFilePromise<ProgressEvent> {
    if (this.isElectron) {
        let promiseObj = this.$q.defer();
        if (replace) {
            try {
                fs.unlinkSync('./' + dirname + '/' + filename);
            }
            catch (err) {
                //err
            }
        }
        fs.writeFile('./' + dirname + '/' + filename, data, 'binary', () => {
            promiseObj.resolve(true);
        });

        return promiseObj.promise;
    }
    else {
        return this.$cordovaFile.writeFile(cordova.file.dataDirectory + dirname, filename, data, replace);
    }
};

Когда используется платформа Ionic, функция работает нормально и загруженные файлы записываются правильно. Однако при использовании платформы Electron все загруженные файлы содержат строку [object Blob],

Как правильно записывать BLOB-объекты в файлы с помощью fs?

БОЛЬШЕ ИНФОРМАЦИИ

Данные изначально записываются как base64 в сообщении JSON, но затем мы делаем это с ним

let fileBlob = this.stringUtilityService.b64ToBlob(dataObj.Data[i].FileContents, 'image/png');

    this.fileSystemService.writeFile(dataObj.Data[i].FileName, 'icons', fileBlob);

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ

Вот функция b64ToBlob(), хотя, насколько я могу судить, эта функция работает нормально и правильно возвращает BLOB-объект, который приложение Ionic правильно сохраняет и может отображать.

b64ToBlob(b64Data: string, contentType: string): any {
        let sliceSize = 512;

        let byteCharacters = atob(b64Data);
        let byteArrays = [];

        for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
            let slice = byteCharacters.slice(offset, offset + sliceSize);

            let byteNumbers = new Array(slice.length);
            for (let i = 0; i < slice.length; i++) {
                byteNumbers[i] = slice.charCodeAt(i);
            }

            let byteArray = new Uint8Array(byteNumbers);

            byteArrays.push(byteArray);
        }

        let blob = new Blob(byteArrays, { type: contentType });
        return blob;
    }

1 ответ

Решение

Переписывание b64ToBlob Функция, подобная приведенной ниже, будет работать нормально. Вы должны вынуть строку подписи заголовка, как data:image/gif;base64, если есть строка в кодировке base64.

b64ToBlob(b64Data: string): any {
  return Uint8Array.from(atob(b64Data), (c) => c.charCodeAt(0));
}
Другие вопросы по тегам