XMLHttpRequest Level 2添加了一个新的接口FormData.利用FormData对象,咱们能够经过JavaScript用一些键值对来模拟一系列表单控件,咱们还可使用XMLHttpRequest的send()方法来异步的提交这个"表单".比起普通的ajax,使用FormData的最大优势就是咱们能够异步上传一个二进制文件.html
let formData = new FormData()
formData主要有两个方法set,append
formData.set('a', 5) // 把a的键值设置为5
formData.append('b', 5) // 把b的兼职设置为5
那set和append区别??
formData.set('a', 5)
formData.set('a', 6) // 把a的键值设置为6 {a: 6}
formData.append('b', 5)
formData.append('b', 6) // 把b的键值[5, 6] {b: [5, 6]}
复制代码
客户端ajax
<body>
<input type="file" id="file" style="display: none;">
<button id="btn">upload</button>
</body>
<script>
let btn = document.querySelector('#btn')
let file = document.querySelector('#file')
btn.onclick = function() {
file.click() // 调取系统选择图片的弹框
}
// 监听input的file变化值
file.onchange = function (event) {
let file = event.target.files[0]
upload(file)
}
function upload(file) {
let xhr = new XMLHttpRequest()
xhr.open('post', '/upload', true)
let formData = new FormData()
formData.set('filename', file)
xhr.send(formData)
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
alert('success')
}
}
}
</script>
复制代码
服务器express
const express = require('express')
const app = express()
const path = require('path')
const multer = require('multer')
const multerObj = multer({ dest: 'uploads/'}) //上传中间件
app.use(multerObj.any())
app.get('/', (req, res, next) => {
res.setHeader('Content-Type', 'text/html')
res.sendFile(path.join(__dirname, 'index.html'))
})
app.post('/upload', (req, res, next) => {
console.log(req.files)
res.send({
'states':'success'
})
})
app.listen(9090, () => {
console.log('server listen 9090')
})
复制代码