同步上传
文件与数据的关系
数据 是 字符串
文件 是 文件
当使用 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 zhangsanconsole.log('password', fd.get('Password')); // password 123fd.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, Bytetype}]*/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 Mbfd = 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);
