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


154

因此,基本上,我需要上传单个图像,将其保存到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

在moz:// a HACKS上找到了一些解决方法,例如这种小提琴本文

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


2
像下面的示例一样,将reader.result存储在localstorage中有什么问题:jsfiddle.net/x11joex11/9g8NN
追踪

对于希望在localStorage上存储大量数据的人们,此库非常不错:pieroxy / lz-string:基于LZ的JavaScript压缩算法
brasofilo

“我真的只需要一个简单的解决方案。” 不是每个人吗?
罗德里戈

Answers:


213

对于也需要解决此问题的人:

首先,我使用获取图像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" />

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

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

在相当多的不同浏览器和版本中对其进行了测试,并且看起来运行良好。


1
不支持Gif,因为画布不支持gif。
艾伦

16
您不需要getBase64Image函数。数据网址已经是基于64的网址,因此,当您调用reader.readAsDataURL时,将只需要发送到reader.onload处理程序的e.target.result。
James H. Kelly

3
请记住,本地/会话存储空间限制为大约5MB。将二进制图像转换为以64为基数的字符串将使它大30%。因此,这不适用于高分辨率图像。
Noel Abrahams

为什么要剥离数据URL的开头部分?减小尺寸?
deostroll '16

3
请注意,您需要首先完全加载图像(否则最终将获得空图像),因此在某些情况下,您需要将处理内容包装到:bannerImage.addEventListener(“ load”,function(){});
YE

9

我在localStorage JQueryImageCaching 用法中编写了一个小的2,2kb的图像保存库:

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

2
2.2千字节对于这样的事情来说是巨大的,再加上我猜想这甚至不影响jQuery本身的大小。我建议不使用jQuery编写它,也许它会更小
ChrisBrownie55 '18

1.74 KB根据gitbub
hakiko

6

您可以将图像序列化为数据URI。这篇博客文章中有一个教程。这将产生一个字符串,您可以将其存储在本地存储中。然后在下一页上,使用数据uri作为图像源。


0

“请注意,您需要首先完全加载图像(否则最终将获得空图像),因此在某些情况下,您需要将处理内容包装到:bannerImage.addEventListener(“ load”,function(){}); – yuga's Nov 1 '17 at 13:04“

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

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


如果可以,请始终使用回调,如果可以避免,则永远不要使用settimeout。通过设计,您希望事情在前一个事情之后发生,并且开销尽可能小。这正是回调设计的目的
Grayson

-2

我提出了相同的问题,而不是存储图像,最终导致本地存储溢出,您只需存储图像的路径即可。就像是:

let imagen = ev.target.getAttribute('src');
arrayImagenes.push(imagen);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.