Dies ist nicht genau das Szenario des OP aber eine Antwort auf die von einigen der Kommentatoren. Es ist eine Lösung basierend auf Cordova und Angular 1, die an andere Frameworks wie jQuery angepasst werden kann. Es gibt Ihnen einen Blob aus Base64-Daten, die Sie irgendwo speichern können und verweisen Sie von Client-Seite Javascript/HTML.
Es beantwortet auch die ursprüngliche Frage auf, wie ein Bild (Datei) von der Base 64 Daten zu erhalten:
Der wichtige Teil ist die Base 64 - Binär-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 });
}
Slicing erforderlich ist um Fehler zu vermeiden.
Funktioniert mit JPG und PDF-Dateien (zumindest was ich getestet habe). Sollte auch mit anderen mimetypes/contenttypes funktionieren. Überprüfen Sie die Browser und deren Versionen, nach denen Sie suchen, sie müssen Uint8Array, Blob und atob unterstützen.
Hier ist der Code, um die Datei an das Gerät des lokalen Speicher mit Cordova/Android zu schreiben:
...
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);
});
...
die Datei selbst schreiben:
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 die neueste Cordova bin mit (6.5.0) und Plugins Versionen:
Ich hoffe, dass dies alle hier in die richtige Richtung führt.
Wenn Sie diese Base64-Daten als Bild haben wollen, müssen Sie die Zeichenfolge auf der Serverseite verarbeiten und den Pfad des gespeicherten Bildes auf der Serverseite verwenden.Sie können dies mithilfe der Ajax Post-Methode tun. – Rayon
Um einen alten Beitrag wieder zu beleben, werfen Sie einen Blick hier: http://Stackoverflow.com/a/19644105 –