考虑这个JSFiddle。在其中我选择了我想要使用画布进行base64编码的照片,因此我可以将它们存储在sessionStorage
中以进行延迟上传。因为我为多个文件设置了它,所以我遍历每个文件并创建一个图像和一个画布,但无论它看起来每次都输出完全相同的base64编码图像。通过测试,我知道在每个循环迭代中,图像是不同的,并且确实指向不同的文件blob,但画布只是一遍又一遍地输出相同的东西,我认为这也是文件列表中的最后一个文件。有时它也只会输出一个“数据”字符串,就是这样。如果有人能指出我正确的方向,我会喜欢它。
代码如下所示:
HTML
<style type="text/css">
input[type="file"] {
display: none;
}
a {
display: inline-block;
margin: 6px;
}
</style>
<form action="#" method="post">
<input type="file" accept="image/*" multiple />
<button type="button">Select Photos</button>
</form>
<nav></nav>
的JavaScript
console.clear();
$(function () {
$("button[type=button]").on("click", function (e) {
$("input[type=file]").trigger("click");
});
$("input[type=file]").on("change", function (e) {
var nav = $("nav").empty();
for (var i = 0, l = this.files.length; i < l; i++) {
var file = this.files[i],
image = new Image();
$(image).on("load", i, function (e) {
var canvas = document.createElement("canvas"),
context = canvas.getContext("2d");
canvas.height = this.height;
canvas.width = this.width;
context.drawImage(this, 0, 0);
nav.append("<a href=\"" + canvas.toDataURL("image/jpeg") + "\" target=\"_blank\">" + e.data + "</a>");
URL.revokeObjectURL(this.src);
});
image.src = URL.createObjectURL(file);
}
});
});
答案 0 :(得分:2)
但无论它看起来输出完全相同的base64 每次编码图像。
.load()
事件是异步的。您可以使用$.when()
,$.Deferred()
,将$.map()
替换为for
循环来处理异步加载的img
元素。需要注意的是,显示的a
元素文本可能不是按数字顺序排列的;可以通过对.then()
处的元素进行排序来调整;虽然没有在问题中解决,但如果需要,也可以按顺序列出或加载图像。
$("input[type=file]").on("change", function(e) {
var nav = $("nav").empty();
var file = this.files
$.when.apply($, $.map(file, function(img, i) {
return new $.Deferred(function(dfd) {
var image = new Image();
$(image).on("load", i, function(e) {
var canvas = document.createElement("canvas")
, context = canvas.getContext("2d");
canvas.height = this.height;
canvas.width = this.width;
context.drawImage(this, 0, 0);
nav.append("<a href=\""
+ canvas.toDataURL()
+ "\" target=\"_blank\">"
+ e.data + "</a>");
dfd.resolve()
URL.revokeObjectURL(this.src);
});
image.src = URL.createObjectURL(img);
return dfd.promise()
})
})).then(function() {
nav.find("a").each(function() {
console.log(this.href + "\n");
})
})
});
})
jsfiddle https://jsfiddle.net/bc6x3s02/19/