如何解决从服务器检索图像,将其存储在localStorage中,并显示它
|| 这应该很简单,但是经过数小时的努力,我仍然无法正常工作。根据firefox的介绍,到目前为止,我的所有尝试都导致图像“损坏或被截断”。 使用jquery-ajax调用从服务器检索图像: $.ajax({
async: false,url: db[key][\"DocumentLink\"],success: function (result2) {
Base64对图像进行编码,并将其存储在localStore中:
在此示例中,我使用的是jquery base64编码插件,但是我尝试了几种。
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编码的数据。
有任何想法吗?
解决方法
演示:http://so.lucafilosofi.com/retrieve-an-image-from-the-server-store-it-in-localstorage-and-display-it
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);
}
?>
阅读此内容可能对您有帮助:
Base 64编码与加载图像文件
如何在HTML文件中编码图像数据?
如何在JavaScript中将字符串编码为Base64?
获取JavaScript中的图像数据?
PS:也许您的Base64
错误?
,浏览器具有5MB的本地存储限制以外的大小限制。 <img src=\"data:image/jpeg;base64,...\">
的数据也受到限制,通常小于5MB。解决此问题的最简单方法是仅通过localStorage传递文件名,然后让浏览器缓存完成工作。
,事实证明,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,(int)fs.Length);
base64 = Convert.ToBase64String(buffer);
}
}
catch (IOException e)
{
return filename + \" / \" + e.Message;
}
return base64;
}
请注意,此代码并不安全,无法直接向外界公开。
我个人使用了包装函数来解析数据库的路径。
,您可以使用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);
try {
var dataUri = canvas.toDataURL();
} catch (e) {
console.log(\"D\'oh!\"); // Improve this error handling,obviously.
}
“ 11”现在将包含图像的数据uri,该数据uri还将包含一个短前缀以及图像的base 64编码。
确保添加对画布支持的检测。 IE 8和更早版本不支持它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。