【发布时间】:2018-12-09 15:55:36
【问题描述】:
以下代码的目标是压缩输入文件(2 MB JPG 文件 => 500 KB 文件),然后在提交<form> 时将其上传到服务器。
将图像从 JPG 文件导入画布并使用 toDataURL 导出时:
function doit() {
var file = document.getElementById('file').files[0],
canvas = document.getElementById('canvas'),
hidden = document.getElementById('hidden'),
ctx = canvas.getContext("2d"),
img = document.createElement("img"),
reader = new FileReader();
reader.onload = function(e) {
img.src = e.target.result;
}
img.onload = function () {
ctx.drawImage(img, 0, 0);
hidden.value = canvas.toDataURL("image/jpeg", 0.5);
}
reader.readAsDataURL(file);
}
<input type="file" onchange="doit();" id="file" />
<form action="/upload" method="post">
<input type="hidden" id="hidden" />
<input type="submit" />
</form>
<canvas id="canvas" style="display: none" />
它可以工作,但<form> 中的输出hidden 字段是base64 编码的,即类似于:
data:image/jpeg;base64,/9j/4AAQSkZJRgAB...
众所周知,base64 使用的二进制数据是正常大小的 1.3333 倍。
问题:在这种情况下,即提交<form>时,如何避免浪费1/3的数据在上传时间(客户端=>服务器)和带宽上?
注意:我认为如果我使用 AJAX 而不是 <form> 提交,问题会一样,不是吗?
【问题讨论】:
-
为什么不简单地
img.src = window.URL.createObjectURL(file)? -
@bigless 我们的目标不是仅仅将文件加载到
img中,而是压缩它(2 MB JPG 文件 => 500 KB 文件,因此是“质量因子”,这里0.5,很重要),然后在提交 时将其上传到服务器
标签: javascript ajax html5-canvas base64