如何将图像保存到localStorage并在下一页显示?

问题描述 投票:126回答:5

所以,基本上,我需要上传一个图像,将其保存到localStorage,然后在下一页显示。

目前,我上传了我的HTML文件:

<input type='file' id="uploadBannerImage" onchange="readURL(this);" />

其中使用此功能在页面上显示图像

function readURL(input) 
{
    document.getElementById("bannerImg").style.display = "block";

    if (input.files && input.files[0]) {
        var reader = new FileReader();

        reader.onload = function (e) {
            document.getElementById('bannerImg').src =  e.target.result;
        }

        reader.readAsDataURL(input.files[0]);
    }
}

图像立即显示在页面上供用户查看。然后要求他们填写表格的其余部分。这部分工作得很好。

表单完成后,然后按“保存”按钮。按下此按钮后,我将所有表单输入保存为localStorage字符串。我需要一种方法来将图像保存为localStorage项目。

保存按钮也会将它们指向新页面。此新页面将在表格中显示用户数据,图像位于顶部。

如此简单明了,一旦按下“保存”按钮,我需要在localStorage中保存图像,然后从localStorage借出下一页上的图像。

我找到了一些解决方案,如this fiddlethis article at moz://a HACKS

虽然我对它的工作方式仍然非常困惑,但我只需要一个简单的解决方案。基本上,我只需要在按下“保存”按钮后通过getElementByID找到图像,然后处理并保存图像。

javascript jquery html html5 local-storage
5个回答
179
投票

对于那些也需要这个问题的人来说:

首先,我用getElementByID抓取我的图像,并将图像保存为Base64。然后我将Base64字符串保存为我的localStorage值。

bannerImage = document.getElementById('bannerImg');
imgData = getBase64Image(bannerImage);
localStorage.setItem("imgData", imgData);

这是将图像转换为Base64字符串的函数:

function getBase64Image(img) {
    var canvas = document.createElement("canvas");
    canvas.width = img.width;
    canvas.height = img.height;

    var ctx = canvas.getContext("2d");
    ctx.drawImage(img, 0, 0);

    var dataURL = canvas.toDataURL("image/png");

    return dataURL.replace(/^data:image\/(png|jpg);base64,/, "");
}

然后,在我的下一页上,我创建了一个带有空白src的图像,如下所示:

<img src="" id="tableBanner" />

当页面加载时,我直接使用接下来的三行从localStorage获取Base64字符串,并将其应用于我创建的空白src的图像:

var dataImage = localStorage.getItem('imgData');
bannerImg = document.getElementById('tableBanner');
bannerImg.src = "data:image/png;base64," + dataImage;

在很多不同的浏览器和版本中进行了测试,它看起来效果很好。


9
投票

我在localStorage中写了一个2.2kb的保存图像库JQueryImageCaching用法:

<img data-src="path/to/image">
<script>
    $('img').imageCaching();
</script>

6
投票

您可以将图像序列化为数据URI。这个blog post有一个教程。这将生成一个可以存储在本地存储中的字符串。然后在下一页上,使用数据uri作为图像的来源。


0
投票

“请注意,您需要先将图像完全加载(否则最终会出现空图像),因此在某些情况下,您需要将处理包装成:bannerImage.addEventListener(”load“,function(){}); - yuga 17年11月1日在13:04“

这非常重要。我今天下午正在探索的一个选项是使用javascript回调方法而不是addEventListeners,因为它似乎也没有正确绑定。在页面加载之前准备好所有元素而不刷新页面是至关重要的。

如果有人可以对此进行扩展,请执行 - 例如,您是否使用settimeout,wait,callback或addEventListener方法来获得所需的结果。哪一个和为什么?


0
投票

我提出了同样的问题,而不是存储图像,最终溢出本地存储,你可以只存储图像的路径。就像是:

let imagen = ev.target.getAttribute('src');
arrayImagenes.push(imagen);
© www.soinside.com 2019 - 2024. All rights reserved.