这应该很简单,但经过几个小时的摔跤,我仍然无法让它发挥作用。根据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编码数据的内容。
有什么想法吗?
答案 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及更早版本不支持它。