浏览器的文件上传和下载
背景:
文件的上传和下载在Web的日常使用是很常见的功能,在项目开发中也会涉及到文件的 上传和下载,下面来说是上传和下载的实现。
文件上传:
1. 原生表单:
原生表单实现文件上传的方式很简单,只需要在form标签中使用input标签即可, multiple属性的作用是设置多个文件上传,如下:
<form action="/example/html5/demo_form.asp" method="get"> 传文件<input type="file" name="img" multiple="multiple" /> <input type="submit" /> </form>
2. FormData对象:
FormData对象可以组装一组用XMLHttpRequest发送请求的键值对。可以通过js的
方式灵活的发送表单,当表单的编码类型设置为multipart/form-data时,则传输数据的方
式和通过submit方式传输的数据格式相同。具体的使用方式如下:
- 创建FormData对象
1 var formData = new FormData()
-
调用append()方法添加字段:
append()方法接收三个参数,第一个参数为字段的名称,第二个属性为字段的值,第三个 参数为可选的参数,该参数可以设置发送请求的头 指定文件名。
1 // 传递字符串 2 formData.append('username', 'username') 3 // 数字 123456 会被立即转换成字符串 "123456" 4 formData.append("accountnum", 123456); 5 // 传递文件,files为文件对象 6 formData.append('fileName', files[0])
-
发送请求:
最后通过发送ajax请求传输数据:
1 var request = new XMLHttpRequest(); 2 request.open("POST", url); 3 request.send(formData);
使用axios框架发送请求:
1 let hCloudApi = axios.create({ 2 baseURL: config.baseUrls 3 }) 4 hCloudApi.post(`/wf/v1/approve`, formData, { 5 headers: {'Content‐Type': 'multipart/form‐data'} 6 }).then((rst) => { 7 resolve(rst) 8 }).catch(error => { 9 reject(error) 10 })
FormData的兼容性如下:
文件下载:
1. a标签:
直接使用a标签指定href属性为下载的文件的url,同时设置download属性即可实现下 载,不过这种方式不兼容IE浏览器。
1 <a href="url" download='filename'>
2.表单提交
使用提交表单的方式不会有兼容性问题,该方式会调用浏览器的下载功能来下载文件。 实现方式为:创建表单及表单元素,设置相应的属性即可,该下载方式为单个文件的下载。
1 var $form = document.createElement('form') 2 var $input = document.createElement('input') 3 $input.setAttribute('type', 'hidden') 4 $input.setAttribute('name', 'access_token') 5 $input.setAttribute('value', token) 6 $form.setAttribute('method', 'get') 7 $form.setAttribute('action', url) 8 $form.appendChild($input) 9 document.body.appendChild($form) 10 $form.submit()