我正在尝试将通过 AJAX 检索到的
blob
数据(图标)保存到 localStorage
。
代码:
var xhr = new XMLHttpRequest();
xhr.open('GET',
'http://g.etfv.co/http://www.google.com',
true);
xhr.responseType = "blob";
xhr.onload = function(e){ //Stringify blob...
localStorage['icon'] = JSON.stringify(xhr.response);
//reload the icon from storage
var fr = new FileReader();
fr.onload =
function(e) {
document.getElementById("myicon").src = fr.result;
}
fr.readAsDataURL(JSON.parse(localStorage['icon']));
}
xhr.send(null);
该代码改编自here,稍加修改即可与
localStorage
一起使用。
localStorage 将所有数据保存为字符串,因此 blob 在保存之前需要以某种方式进行“字符串化”。
JSON
不将 blob 作为其支持的类型之一来处理,因此此代码失败也就不足为奇了。
有什么方法可以将blob放入localStorage吗?
var xhr = new XMLHttpRequest();
xhr.open('GET',
'http://g.etfv.co/http://www.google.com',
true);
xhr.responseType = "blob";
xhr.onload = function(e){ //Stringify blob...
//reload the icon from storage
var fr = new FileReader();
fr.onload =
function(e) {
localStorage['icon'] = e.target.result;
document.getElementById("myicon").src = localStorage['icon'];
}
fr.readAsDataURL(xhr.response);
}
xhr.send(null);
fetch
API 来完成这项工作。
const getFromCacheOrDownload = async (url) => {
const base64CachedImg = localStorage.getItem(url)
if (base64CachedImg) {
const response = await fetch(base64CachedImg)
const blob = await response.blob()
return URL.createObjectURL(blob)
} else {
const response = await fetch(url)
if (response.status === 429) {
console.log('too many requests')
}
const blob = await response.blob()
const imageUrl = URL.createObjectURL(blob)
const base64String = (await convertBlobToBase64(blob))
localStorage.setItem(url, base64String)
return imageUrl
}
}
上面的代码会尝试从缓存中获取图片。如果没有,它会下载它并将其存储在缓存中。