Це не зовсім сценарій ОП, а відповідь на запитання деяких коментаторів. Це рішення, засноване на Cordova та Angular 1, яке має бути адаптованим до інших фреймворків, таких як jQuery. Це дає вам Blob із даних Base64, які ви можете десь зберігати та посилатись на них з боку клієнта javascript / html.
Він також відповідає на вихідне запитання про те, як отримати зображення (файл) із даних Base 64:
Важливою частиною є Base 64 - двійкове перетворення:
function base64toBlob(base64Data, contentType) {
contentType = contentType || '';
var sliceSize = 1024;
var byteCharacters = atob(base64Data);
var bytesLength = byteCharacters.length;
var slicesCount = Math.ceil(bytesLength / sliceSize);
var byteArrays = new Array(slicesCount);
for (var sliceIndex = 0; sliceIndex < slicesCount; ++sliceIndex) {
var begin = sliceIndex * sliceSize;
var end = Math.min(begin + sliceSize, bytesLength);
var bytes = new Array(end - begin);
for (var offset = begin, i = 0; offset < end; ++i, ++offset) {
bytes[i] = byteCharacters[offset].charCodeAt(0);
}
byteArrays[sliceIndex] = new Uint8Array(bytes);
}
return new Blob(byteArrays, { type: contentType });
}
Нарізка потрібна, щоб уникнути помилок, що втрачають пам’ять.
Працює з файлами jpg та pdf (принаймні, це я тестував). Слід також працювати з іншими типами mime / contenttypes. Перевірте браузери та їх версії, для яких ви прагнете, вони повинні підтримувати Uint8Array, Blob та atob.
Ось код для запису файлу в локальну пам’ять пристрою за допомогою Cordova / Android:
...
window.resolveLocalFileSystemURL(cordova.file.externalDataDirectory, function(dirEntry) {
var filename = attachment.id + "-" + (attachment.fileName ? attachment.fileName : 'image') + "." + (attachment.fileType ? attachment.fileType : "jpg");
dirEntry.getFile(filename, { create: true, exclusive: false }, function(fileEntry) {
var binary = base64toBlob(attachment.document, attachment.mimetype);
writeFile(fileEntry, binary).then(function() {
attachment.document = fileEntry.nativeURL;
}, function(error) {
WL.Logger.error("Error writing local file: " + error);
reject(error.code);
});
}, function(errorCreateFile) {
WL.Logger.error("Error creating local file: " + JSON.stringify(errorCreateFile));
reject(errorCreateFile.code);
});
}, function(errorCreateFS) {
WL.Logger.error("Error getting filesystem: " + errorCreateFS);
reject(errorCreateFS.code);
});
...
Запис самого файлу:
function writeFile(fileEntry, dataObj) {
return $q(function(resolve, reject) {
fileEntry.createWriter(function(fileWriter) {
fileWriter.onwriteend = function() {
WL.Logger.debug(LOG_PREFIX + "Successful file write...");
resolve();
};
fileWriter.onerror = function(e) {
WL.Logger.error(LOG_PREFIX + "Failed file write: " + e.toString());
reject(e);
};
if (!dataObj) {
dataObj = new Blob(['missing data'], { type: 'text/plain' });
}
fileWriter.write(dataObj);
});
})
}
Я використовую останню версію Cordova (6.5.0) та плагінів:
Я сподіваюся, це налаштовує всіх тут у правильному напрямку.