นี่ไม่ใช่สถานการณ์ของ OP แต่เป็นคำตอบสำหรับผู้แสดงความคิดเห็นบางคน เป็นโซลูชันที่ใช้ Cordova และ Angular 1 ซึ่งควรปรับให้เข้ากับเฟรมเวิร์กอื่น ๆ เช่น jQuery มันให้ข้อมูล Blob จาก Base64 ซึ่งคุณสามารถเก็บไว้ที่ไหนสักแห่งและอ้างอิงจาก javascript / html ฝั่งไคลเอ็นต์
นอกจากนี้ยังตอบคำถามเดิมเกี่ยวกับวิธีรับภาพ (ไฟล์) จากข้อมูลฐาน 64:
ส่วนที่สำคัญคือฐาน 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 (อย่างน้อยนั่นคือสิ่งที่ฉันทดสอบ) ควรทำงานร่วมกับประเภทอื่น ๆ / ประเภทเนื้อหาด้วย ตรวจสอบเบราว์เซอร์และเวอร์ชันที่คุณตั้งเป้าไว้ว่าต้องรองรับ 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) และ Plugins เวอร์ชันล่าสุด:
ฉันหวังว่านี่จะทำให้ทุกคนไปในทิศทางที่ถูกต้อง