一个很普通的场景,前端一次性选择多个文件上传到后端。
需要注意的是使用FormData.append把多个文件添加到一个键上,设置请求header的content-type为mutilpart/form-data
先说正确的步骤:
1.前端使用input标签配合oncahnge事件获取文件
1 <input type="file" name="file" id="file" multiple/>
1 let file = document.getElementById("file"); 2 file.addEventListener("change", (event) => { 3 console.info(event.target.files); // 获取文件 4 });
2.使用FormData结合axios向后端发送请求
1 let files = event.target.files; 2 let formData = new FormData(); 3 files = Array.from(files); // files是类数组,需要先转为数组 4 files.forEach((file) => { 5 formData.append("file", file); 6 }); 7 axios 8 .post(url, formData, { 9 headers: { "Content-Type": "multipart/form-data" } 10 }) 11 .then(console.info) 12 .catch(console.error);
3.后端使用MutilpartFile []file接收多个文件
file参数对应前端FormData中存放文件的键file。
注意事项:
1.向后端传递文件类型的参数,需要把文件放入formData中,FormData使用键值对存放数据,如formData.set("key", value);value的类型只能是string、boolean、blob;
直接向FormData中存放数组和对象是无效的,那么多个文件是不能用set放在一个键上的,可以使用FormData.append方法,该方法也是接收键值对,但是可以多次向一个键上添加数据,后面的不会覆盖前面的,而是组合成一个list。
2.input.files是类数组,如果迭代files可以先用Array.from转为数组。
3.向后端发请求传递文件时需要设置header的content-type为multipart/form-data。
axios配置的优先级:
1. 在lib.default.js找到的库的默认值
2. 然后是全局的defaults配置
axios.default.baseURL = "https://jsonplaceholder.typicode.com"
3. 然后是实例的defaults属性
const instance = axios.create({
baseURL: 'https://jsonplaceholder.typicode.com'
});
4. 最后是请求的config参数
instance.get(url, config).then(res => {
})