Ini bukan skenario OP tetapi jawaban dari beberapa komentator. Ini adalah solusi berdasarkan Cordova dan Angular 1, yang harus dapat disesuaikan dengan kerangka kerja lain seperti jQuery. Ini memberi Anda Blob dari data Base64 yang dapat Anda simpan di suatu tempat dan mereferensikannya dari sisi klien javascript / html.
Ini juga menjawab pertanyaan asli tentang bagaimana mendapatkan gambar (file) dari data Base 64:
Bagian penting adalah Basis 64 - Konversi biner:
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 });
}
Pemotongan diperlukan untuk menghindari kesalahan memori.
Bekerja dengan file jpg dan pdf (setidaknya itulah yang saya uji). Harus bekerja dengan mimetypes / contenttypes lain juga. Periksa browser dan versinya yang Anda tuju, mereka perlu mendukung Uint8Array, Blob dan atob.
Berikut kode untuk menulis file ke penyimpanan lokal perangkat dengan 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);
});
...
Menulis file itu sendiri:
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);
});
})
}
Saya menggunakan Cordova (6.5.0) dan versi Plugin terbaru:
Saya harap ini membuat semua orang di sini ke arah yang benar.