您的位置:

前端文件上传的相关知识

一、为什么需要文件上传功能

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应用的必要功能,虽然前端文件上传看起来简单,但是需要开发者理解上传方式、限制等方方面面,才能实现高效安全的上传操作。