Đây không chính xác là kịch bản của OP mà là câu trả lời của một số nhà bình luận. Đây là một giải pháp dựa trên Cordova và Angular 1, có thể thích ứng với các khung công tác khác như jQuery. Nó cung cấp cho bạn một Blob từ dữ liệu Base64 mà bạn có thể lưu trữ ở đâu đó và tham chiếu nó từ javascript / html phía máy khách.
Nó cũng trả lời câu hỏi ban đầu về cách lấy hình ảnh (tệp) từ dữ liệu Cơ sở 64:
Phần quan trọng là Cơ sở 64 - Chuyển đổi nhị phân:
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 });
}
Cần phải cắt lát để tránh lỗi hết bộ nhớ.
Hoạt động với các tệp jpg và pdf (ít nhất đó là những gì tôi đã thử nghiệm). Cũng nên hoạt động với các kiểu mimety / nội dung khác. Kiểm tra các trình duyệt và phiên bản của chúng mà bạn hướng tới, chúng cần hỗ trợ Uint8Array, Blob và atob.
Đây là mã để ghi tệp vào bộ nhớ cục bộ của thiết bị với 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);
});
...
Viết chính tệp:
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);
});
})
}
Tôi đang sử dụng phiên bản Cordova (6.5.0) và Plugins mới nhất:
Tôi hy vọng điều này đưa mọi người ở đây đi đúng hướng.