javascript - 上传多张图片并将它们保存到javascript中的localStorage
问题描述
我正在尝试为我的 Web 应用程序创建一个功能,允许用户上传多个图像作为博客文章的一部分,然后稍后在显示所有博客文章列表的页面上查看它们。我想要做的是,允许用户上传多个图像并将这些图像保存到 localStorage。目前我正在遍历用户上传的所有图像文件,然后为每个文件添加一个新的 fileReader。为了将它们添加到 localStorage,我知道我必须使每个图像的键值不同(即 img1=第一张图像,img2=第二张图像等)根据下面的代码,我正在更改键使用 for 循环上传的每个图像的值,并将其设置为img${i}
.
但是,当我尝试在每个 fileReader 组件上添加“加载”事件侦听器以读取每个单独的图像文件以便将其保存到 localStorage 时,因为它是“加载”事件,“i”的值是不同的。所以结果,我只能保存已经上传的最终图片(即img3)。我假设这是由“加载”事件中的代码引起的,因此它只会在所有文件加载后才考虑最终的“i”值。有没有办法解决这个问题?非常感谢任何朝着正确方向的帮助。我正在尝试用纯 javascript 来实现这一点,所以请不要使用 jquery。谢谢你。
HTML
<!--Upload images-->
<input type="file" id="filetag" multiple accept=".jpg,.jpeg,.png,.gif">
<img id="preview">
Javascript
const fileSelector=document.getElementById('filetag');
const display = document.getElementById("preview");
fileSelector.addEventListener('change',(e)=>{
//gets all the files uploaded
let fileList = e.target.files;
console.log(fileList)
for(i=0;i<fileList.length;i++){
//add a new fileReader for each element
let reader = new FileReader();
reader.addEventListener("load", () =>{
//store each uploaded image into localStorage
localStorage.setItem(`img${i}`,reader.result)
console.log(i)
})
reader.readAsDataURL(fileList[i]);
}
})
解决方案
首先,我认为您不应该为此使用 LocalStorage。此外 LocalStorage 的大小是有限的。如果您有后端,则应将这些图像保存在服务器中,然后像任何普通网站一样使用 URL 加载它们。
无论如何,我回答你的问题。不要使用数组(并且索引存在问题),而是将其转换为对象,然后使用对象键:
let fileList = e.target.files;
let files = {};
let index = 0;
for(let file of files) {
files[index] = file;
index ++;
}
// Now iterate object instead of array
Object.keys(files).forEach( key => {
let reader = new FileReader();
reader.addEventListener("load", () =>{
localStorage.setItem(`img${key}`,reader.result)
})
reader.readAsDataURL(files[key]);
});
推荐阅读
- javascript - 将 PHP 变量保存在 Javascript 变量中时出现意外标记
- linux-kernel - Linux GPIO 编号如何获取它们的值?
- c# - 我可以将 model.currentuser 修改为我当前登录系统的用户名,因为它的值是在获取 IdentityServer3 时默认设置的
- docker - Docker-compose 重启:除非停止 - 奇怪的行为
- opencv - ICP::registerModelToScene() 无法运行最小示例
- java - 如何对文件中的文本行块进行排序?
- r - R如何从它们的矩阵值中堆叠图像
- python - 如何调用 rospy.init_node() 两次
- javascript - 自定义 - 用于验证自定义电子邮件地址的 Javascript 正则表达式
- android - BottomNavigationView 布局问题