Dies ist nicht genau das Szenario des OP, sondern eine Antwort auf die einiger Kommentatoren. Es ist eine auf Cordova und Angular 1 basierende Lösung, die an andere Frameworks wie jQuery angepasst werden sollte. Sie erhalten einen Blob aus Base64-Daten, den Sie irgendwo speichern und aus clientseitigem Javascript / HTML referenzieren können.
Es beantwortet auch die ursprüngliche Frage, wie ein Bild (eine Datei) aus den Base 64-Daten abgerufen werden kann:
Der wichtige Teil ist die Base 64 - Binäre Konvertierung:
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 });
}
Das Schneiden ist erforderlich, um Speicherfehler zu vermeiden.
Funktioniert mit JPG- und PDF-Dateien (zumindest habe ich das getestet). Sollte auch mit anderen Mimetypen / Inhaltstypen funktionieren. Überprüfen Sie die Browser und deren Versionen, die Sie anstreben. Sie müssen Uint8Array, Blob und atob unterstützen.
Hier ist der Code zum Schreiben der Datei in den lokalen Speicher des Geräts mit Cordova / Android:
...
window.resolveLocalFileSystemURL(cordova.file.externalDataDirectory, function(dirEntry) {
// Setup filename and assume a jpg file
var filename = attachment.id + "-" + (attachment.fileName ? attachment.fileName : 'image') + "." + (attachment.fileType ? attachment.fileType : "jpg");
dirEntry.getFile(filename, { create: true, exclusive: false }, function(fileEntry) {
// attachment.document holds the base 64 data at this moment
var binary = base64toBlob(attachment.document, attachment.mimetype);
writeFile(fileEntry, binary).then(function() {
// Store file url for later reference, base 64 data is no longer required
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);
});
...
Schreiben der Datei selbst:
function writeFile(fileEntry, dataObj) {
return $q(function(resolve, reject) {
// Create a FileWriter object for our FileEntry (log.txt).
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 data object is not passed in,
// create a new Blob instead.
if (!dataObj) {
dataObj = new Blob(['missing data'], { type: 'text/plain' });
}
fileWriter.write(dataObj);
});
})
}
Ich verwende die neuesten Versionen von Cordova (6.5.0) und Plugins:
Ich hoffe, das bringt alle hier in die richtige Richtung.