同步上传
文件与数据的关系
数据 是 字符串
文件 是 文件
当使用 form 表单 POST 提交时数据时,是以 applicantion/x-www-form-urlencoded
的数据编码格式来提交,把提交的数据键值对化。这是 form 使用 POST 提交时默认的方式。
<input type="text" name="username" />
<input type="password" name="password" />
转为 username=123&password=13579 这样的键值对格式
所以针对文件上传,要修改 form 表单的 enctype 编码方式。
对于文件会使用到 二进制 或 blob 的方式进行编码。
<form action="server/upload.php" enctype="multipart/form-data">
<input type="file" name="file" />
</form>
multipart/form-data
会把上传的文件转为二进制。
支持多文件
input 标签增加 multiple 属性,并且 name 改为数组(加增 []
)
<form action="server/upload.php" enctype="multipart/form-data">
<input type="file" name="file[]" multiple />
</form>
如果不使用 multiple 属性,也可以使用多个 input 进行选择,并使他们的 name 为相同的数组
<form action="server/upload.php" enctype="multipart/form-data">
<input type="file" name="file[]" />
<input type="file" name="file[]" />
<input type="file" name="file[]" />
<input type="file" name="file[]" />
<input type="file" name="file[]" />
</form>
FormData
https://www.yuque.com/sylaryip/gpvww7/vkm8fc#CfRJk
FormData() 表单数据的构造函数
<input type="text" id="username" value="zhangsan"/>
<input type="text" id="password" value="123" />
<input type="sumbit" id="submitBtn" value="提交" />
var oUsername = document.getElementById('username'),
oPassword = document.getElementById('password'),
oSubmitBtn = document.getElementById('submitBtn'),
fd = new FormData();
oSubmitBtn.onclick = function(){
fd.append('Username', oUsername.value);
fd.append("Password", oPassword.value);
console.log(fd); // FormData {}
console.log('username', fd.get('Username')); // username zhangsan
console.log('password', fd.get('Password')); // password 123
fd.set('username', 'lisi');
fd.has('password');
fd.delete('pasword');
console.log('password', fd.get('Password')); // password null
}
异步上传
进度条
选择后即刻上传
借助 input 的 onchange 事件
oFile.onchange = function(){
console.log(oFile.files);
/*
[{
lastModified,
lastModifiedDate,
name,
size, Byte
type
}]
*/
var files = oFile.files,
filelen = files.length;
if(filelen <= 0){
console.log('还未选择文件');
}
if(filelen > 5){
console.log('最多同时上传 5 个文件');
}
}
文件验证
oFile.onchange = function(){
var files = oFile.files,
filelen = files.length,
fileName = '',
fileSize = 0,
maxSize = '1048576', // 1 Mb
fd = null,
errorInfo = '';
for(var i = 0; i < fileLen; i ++){
fileName = files[i].name;
fileSize = files[i].szie;
if(!/\.(gif|jpg|jpeg|png|pdf)$/.test(fileName)){
errorInfo = `${fileName} 文件类型不支持`;
}
if(fileSize > maxSize){
errorInfo = `${fileName} 超过可上传大小`;
}
}
}
上传和进度条回调
基于 FormData 与 XHR 实现
fd = new FormData();
fd.append('file', files[i]);
var o = window.XMLHttpRequest ?
new window.XMLHttpRequest() :
new ActiveXObject("Mircosoft.XMLHTTP");
o.open('post', 'server/upload.php');
o.upload.onprogress = function(e){
var e = e || window.event,
percent = e.loaded/ e.total * 100 + "%";
}
o.send(fd);