从服务器检索图像,将其存储在localStorage中并显示它

时间:2011-03-19 18:25:16

标签: javascript ajax image html5 base64

这应该很简单,但经过几个小时的摔跤,我仍然无法让它发挥作用。根据firefox的说法,到目前为止,我的所有尝试都导致图像变得“损坏或被截断”。

使用jquery-ajax调用从服务器检索图像:

 $.ajax({
                async: false,
                url: db[key]["DocumentLink"],
                success: function (result2) {


Base64对图像进行编码,并将其存储在localStore中:
在这个例子中,我使用的是jquery base64-encoding插件,但我已经尝试了几个。

                        var dbKey = "Doc " + db[key]["ID"] + " " + db[key]["Title"];
                        console.log("storing: " + db[key]["DocumentLink"] + " in " + dbKey + "\n");
                        localStorage.removeItem(dbKey);
                        var base64Image = $.base64Encode(result2);
                        console.log(base64Image.length);
                        localStorage.setItem(dbKey, base64Image);
                       console.log("is stored: " + db[key]["DocumentLink"] + " in " + dbKey + "\n");
                }
})


使用数据网址显示图像:

function openImageFromDB(dbKey) {
    console.log("Trying to display image with key " + dbKey);
    var base64Img = localStorage.getItem(dbKey);
    document.getElementById("documentHolder").src='data:image/jpeg;base64,' + base64Img;
}


相应的img:

 <img id="documentHolder" alt="Image view placeholder" src="" />


但是,每次尝试时,firefox都会显示:

Image corrupt or truncated: data:image/jpeg;base64,77+977+977+977+9a<... much longer string>


Url:指向有效的jpeg图像,base64Image.length和错误消息显示var / localStorage实际上包含似乎是base64编码数据的内容。

有什么想法吗?

4 个答案:

答案 0 :(得分:8)

  

Javascript(AJAX调用)

function LoadImg(filename) {
    var xmlhttp;
    if (window.XMLHttpRequest) { // code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp = new XMLHttpRequest();
    } else { // code for IE6, IE5
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {     
            document.getElementById("documentHolder").src = "data:image/png;base64," + xmlhttp.responseText;
        }
    };    
    xmlhttp.open("GET", 'load.php?LoadImg='+filename );
    xmlhttp.send(null);
}

PHP(load.php)

<?php
 if (isset($_GET['LoadImg'])) {
  header("Content-Type: image/png");
  $file = file_get_contents($_GET['LoadImg']);
  echo base64_encode($file);
}
?>

阅读本文可能会对您有所帮助:

  

PS:也许您的Base64错了?

答案 1 :(得分:6)

浏览器的大小限制除了localStorage限制为5MB之外。 <img src="data:image/jpeg;base64,...">的数据也受到限制,通常远小于5MB。最简单的方法是通过localStorage传递文件名,让浏览器缓存完成工作。

答案 2 :(得分:2)

事实证明,AJAX不能用于可靠地传输二进制数据。解决方案是运行Base64编码服务器端,并通过AJAX传输结果字符串。

上面的php代码有效。对于谁在寻找ASP.Net / C#解决方案:

    public string Image(string relpath)
    {
        Response.ContentType = "image/jpeg";

        string base64;
        string filename = Request.PhysicalApplicationPath + relpath;
        try
        {
            using (var fs = new FileStream(filename, FileMode.Open, FileAccess.Read))
            {
                var buffer = new byte[fs.Length];
                fs.Read(buffer, 0, (int)fs.Length);
                base64 = Convert.ToBase64String(buffer);
            }
        }
        catch (IOException e)
        {
            return filename + " / " + e.Message;
        }
        return base64;
    }

请注意,此代码不安全直接暴露给外部世界。 我个人使用一个包装函数来解析db的路径。

答案 3 :(得分:0)

您可以使用HTML5 canvas元素通过JavaScript获取数据uri(包含base 64编码)。

        // I'm assuming here you've put the image in an <img> tag on the page already.
        // If not, you'll need to adapt this a bit, or perhaps this approach is just
        // not right for your situation.
        var image = document.getElementById('id-of-image-you-want');

        var canvas = w.document.createElement("canvas"); 
        canvas.width = image.width;
        canvas.height = image.height;

        var ctx = canvas.getContext("2d");
        ctx.drawImage(image, 0, 0);
        try {
            var dataUri = canvas.toDataURL();    
        } catch (e) {
            console.log("D'oh!"); // Improve this error handling, obviously.
        }

dataUri现在将包含图像的数据uri,该数据将包含图像的base 64编码以及短前缀。

请务必添加画布支持检测。 IE 8及更早版本不支持它。