一、为什么需要文件上传功能
1、随着互联网应用的不断增加,前端上传文件功能变得越来越常见。比如:用户上传头像、上传文件、上传图片等都需要前端文件上传功能的支持。
2、前端文件上传功能也是提高应用体验的一个重要手段,可以使用户方便快捷地上传自己想要分享的文件,节省用户时间。
3、同时,前端文件上传功能也为开发者提供了更多的创意空间,如通过web端文件上传实现实时数据的展示、动态修改文件等功能。
二、前端文件上传方式
1、form表单上传方式
<form action="server/upload.php" enctype="multipart/form-data" method="POST"> <input type="file" name="file"> <input type="submit" value="上传"> </form>
使用form表单上传功能时,需要设置enctype属性值为"multipart/form-data",同时将表单数据设置为POST请求方式。form表单并不需要额外的JavaScript操作,但是对于大文件上传用户上传等场景并不友好。
2、XMLHttpRequest上传方式
var fileObj = document.getElementById("file").files[0]; var xhr = new XMLHttpRequest(); var form = new FormData(); form.append("file", fileObj);//添加file到表单 xhr.open("post", "/upload", true); xhr.onload = function(){ console.log("上传成功"); } xhr.send(form);//发送文件
使用XMLHttpRequest上传文件可以通过JavaScript实现进度条的功能,同时利用FormData类和Blob对象将文件作为二进制数据传送给后端服务器。
三、前端文件上传的限制
1、文件大小限制
可以通过设置input[type="file"]的accept、capture、multiple属性限制文件的大小,但是IE浏览器并不支持这些属性,因此需要通过JavaScript判断文件大小并给出提示,同时后端服务器也需要做相应的文件上传大小限制,防止恶意上传。
<input type="file" name="file" accept="image/gif, image/jpeg" capture="camera" multiple> <script> var fileObj = document.getElementById("file").files[0]; var fileSize = fileObj.size; if(fileSize > 10*1024*1024){//限制文件为10M以下 alert("文件太大了"); } </script>
2、文件类型限制
同样也可以通过input[type="file"]的accept属性和后端服务器的文件类型判断限制来限制文件格式,防止非法文件上传,提高安全性。
<input type="file" name="file" accept=".jpg, .png, .gif">
四、前端文件上传注意事项
1、如果上传的文件较大,需要给予用户上传进度的反馈,可以通过调用XMLHttpRequest的progress函数来获取上传进度。
xhr.upload.onprogress = function(event){ if(event.lengthComputable){ var percentComplete = event.loaded / event.total * 100; console.log("上传进度:" + percentComplete + "%") } }
2、在上传大文件时,客户端应该将文件切分为多个小文件并分别上传,提高上传效率。
3、对于跨域的上传请求,需要服务端设置允许CORS跨域请求,同时客户端在发送请求前也要修改XHR的特定设置来使其支持跨域请求。
4、如果有需要,在文件上传前可以对文件进行压缩、加密等操作,提高上传速度同时保障安全性。
五、总结
前端文件上传是实现很多web应用的必要功能,虽然前端文件上传看起来简单,但是需要开发者理解上传方式、限制等方方面面,才能实现高效安全的上传操作。