作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
以下代码的目标是压缩输入文件(2 MB JPG 文件 => 500 KB 文件),然后在提交 <form>
时将其上传到服务器.
将图像从 JPG 文件导入 Canvas 并使用 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" />
它可以工作,但是输出 hidden
<form>
中的字段是 base64 编码的,即类似:
data:image/jpeg;base64,/9j/4AAQSkZJRgAB...
众所周知,base64 使用二进制数据正常大小的 1.3333 倍。
问题:在这种情况下,即提交<form>
时,如何避免浪费1/3的数据上传时间(客户端=>服务器)和带宽? ?
注意:我认为如果我使用 AJAX 而不是 <form>
问题将会是相同的提交,不是吗?
最佳答案
var jsForm = null;
function doit() {
var file = document.getElementById('file').files[0],
canvas = document.getElementById('canvas'),
ctx = canvas.getContext("2d"),
img = document.createElement("img");
img.src = window.URL.createObjectURL(file);
img.onload = function () {
if (!jsForm) {
jsForm = new FormData();
}
ctx.drawImage(img, 0, 0);
canvas.toBlob(function(blob) {
jsForm.set('image', blob, file.name);
}, "image/jpeg", 0.5);
}
}
var form = document.getElementById('form');
form.onsubmit = function(e) {
e.preventDefault();
if (!jsForm) return;
var request = new XMLHttpRequest();
request.open(this.method||'POST', this.action||'/');
request.send(jsForm);
jsForm = null;
}
<form method="POST" action ="/upload" id="form">
<input type="file" onchange="doit();" id="file" />
<button>Submit</button>
</form>
<canvas id="canvas" style="display: none" />
关于javascript - toDataURL的输出是base64,如何将上传时间和带宽减少1/3?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51118927/
我有以下正则表达式 /[a-zA-Z0-9_-]/ 当字符串只包含从 a 到z 大小写、数字、_ 和 -。 我的代码有什么问题? 能否请您向我提供一个简短的解释和有关如何修复它的代码示例? //var
我是一名优秀的程序员,十分优秀!