当用户上传图片时,如何上传一个大图,我们势必会在前台做成缩略图再上传以节约流量,减少用户上传等待时间。
其中主要使用到了
1. File API 获取图片
2. 使用 createObjectURL() 或者 FileReader 预览图片
3. 使用 canvas 做缩略图
4. 上传缩略图
以上相关API 都可以在MDN上找到
代码示例1
<!DOCTYPE html>
<html lang="en">
<head>
<title></title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<script>
window.onload = function () {
var input = document.createElement('input');
input.type = 'file';
input.addEventListener('change', function () {
var file = this.files[0];
var img = document.createElement('img');
img.src = window.URL.createObjectURL(file);
img.onload = function () {
var canvas = document.createElement('canvas');
var ctx = canvas.getContext('2d');
var MAX_WIDTH = 150;
var MAX_HEIGHT = 200;
var width = img.width;
var height = img.height;
if (width > height) {
if (width > MAX_WIDTH) {
height *= MAX_WIDTH / width;
width = MAX_WIDTH;
}
} else {
if (height > MAX_HEIGHT) {
width *= MAX_HEIGHT / height;
height = MAX_HEIGHT;
}
}
canvas.width = width;
canvas.height = height;
ctx.drawImage(img, 0, 0, width, height);
document.body.appendChild(canvas);
var btn = document.createElement('button');
btn.innerHTML = '上传';
document.body.appendChild(btn);
btn.addEventListener('click', function() {
/*
toBlob的兼容性问题使用
https://github.com/blueimp/JavaScript-Canvas-to-Blob 这个库,就可以解决
*/
canvas.toBlob(function(blob) {
var form = new FormData();
form.append('file', blob);
fetch('/api/upload', {method: 'POST', body: form});
});
}, false);
};
// document.body.appendChild(img); 原始图片是不用展示出来的
}, false);
document.body.appendChild(input);
};
</script>
</body>
</html>代码示例2
<input type="file" onchange="upperCase(this.files[0])">
<canvas width="32" height="32" id="myCanvas"></canvas>
<script>
function upperCase(thiss){
var img = document.createElement('img');
img.src = window.URL.createObjectURL(thiss);
img.onload = function () {
var canvas = document.getElementById("myCanvas");
var ctx = canvas.getContext('2d');
ctx.drawImage(img, 0, 0, 32, 32);
}
}
</script>详解:
获取图片
通过 File API 获取图片。
var input = document.createElement('input');
input.type = 'file';
input.addEventListener('change', function() {
var file = this.files[0];
});
input.click();预览图片
使用 createObjectURL() 或者 FileReader 预览图片
var img = document.createElement('img');
img.src = window.URL.createObjectURL(file);var img = document.createElement("img");
var reader = new FileReader();
reader.onload = function(e) {
img.src = e.target.result;
}
reader.readAsDataURL(file);使用 canvas 做缩略图
var canvas = document.createElement("canvas");
var ctx = canvas.getContext("2d");
var MAX_WIDTH = 800;
var MAX_HEIGHT = 600;
var width = img.width;
var height = img.height;
if (width > height) {
if (width > MAX_WIDTH) {
height *= MAX_WIDTH / width;
width = MAX_WIDTH;
}
} else {
if (height > MAX_HEIGHT) {
width *= MAX_HEIGHT / height;
height = MAX_HEIGHT;
}
}
canvas.width = width;
canvas.height = height;
ctx.drawImage(img, 0, 0, width, height);上传缩略图
canvas.toBlob(function(blob) {
var form = new FormData();
form.append('file', blob);
fetch('/api/upload', {method: 'POST', body: form});
});DEMO:upload.js
var fileObj = {};
var imgElem = document.querySelector(".images");
var fileElem = document.createElement('input');
fileElem.type = 'file';
imgElem.addEventListener('click', function() {
fileElem.click();
});
fileElem.addEventListener('change', function() {
startProgress();
var file = this.files[0];
imgElem.innerHTML = '<img src="' + window.URL.createObjectURL(file) + '" />';
btnSave.disabled = true;
var img = document.createElement("img");
var canvas = document.createElement("canvas");
var ctx = canvas.getContext("2d");
img.src = window.URL.createObjectURL(file);
img.onload = function() {
var MAX_WIDTH = 800;
var MAX_HEIGHT = 600;
var width = img.width;
var height = img.height;
if (width > height) {
if (width > MAX_WIDTH) {
height *= MAX_WIDTH / width;
width = MAX_WIDTH;
}
} else {
if (height > MAX_HEIGHT) {
width *= MAX_HEIGHT / height;
height = MAX_HEIGHT;
}
}
canvas.width = width;
canvas.height = height;
var ctx = canvas.getContext("2d");
ctx.drawImage(img, 0, 0, width, height);
canvas.toBlob(function(blob) {
var form = new FormData()
form.append('file', blob);
fetch('/api/upload', {method: 'POST', body: form })
.then(function(rsp) {return rsp.json()})
.then(function(rsp) {
fileObj = rsp;
stopProgress();
btnSave.disabled = false;
})
.catch(function(rsp) {
console.log(rsp);
stopProgress();
btnSave.disabled = false;
})
})
}
});
HTML5- Canvas入门(五) - vajoy
如何让你的动画更自然
window.webkitURL是用来判断什么的?
URL对象是硬盘(SD卡等)指向文件的一个路径,如果我们做文件上传的时候,想在没有上传服务器端的情况下看到上传图片的效果图的时候就可是以通过[code]var url=window.URL.createObjectURL(obj.files[0]);[/url]获得一个http格式的url路径,这个时候就可以设置到<img>中显示了。
window.webkitURL和window.URL是一样的,window.URL标准定义,window.webkitURL是webkit内核的实现(一般手机上就是使用这个),还有火狐等浏览器的实现。
多张图片上传jQuery插件
h5图片上传简易版(FileReader+FormData+ajax)