同步上传:必须写上 enctype="multipart/form-data" input不能省name属性的值
<form enctype="multipart/form-data" action="/upload" method="post">
<input type="file" name="file" id="file">
<input type="submit" name="" value="提交">
</form>
异步上传:不用在form上加属性,input的name也可以不要,因为可以用id获取dom元素
注意:
formData('filename', 'file')
e.preventDefault
<form>
<input type="file" name="" id="file">
<input type="submit" name="" value="提交">
</form>
// 原生
upload() {
document.querySelector('form').onsubmit = function(e) {
e.preventDefault(); // 取消默认事件
var formData = new FormData();
formData.append('myFile', document.getElementById('file').files[0]);
var xhr = new XMLHttpRequest();
xhr.open('post', '/upload');
xhr.send(formData);
xhr.onreadyStatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
alert("成功");
}
}
}
}
// jquery
upload() {
$('form').on('submit', function(e) {
var formData = new FormData();
formData.append('myFile', document.getElementById('file').files[0]);
e.preventDefault();
// 下方必须加 contentType: false, processData: false,
// 否则会报错:Illegal invocation
// 这是因为:jq默认头是 content-type: www-url... 键值对
// 当data传递的是个formData时,jq会默认将该对象转为键值对字符串,这是不合理的
$.ajax({
url: '/upload',
type: 'post',
data: formData,
contentType: false, // 不需要头
processData: false, // 不需要转数据
success: function() {
console.log('ok');
}
})
});
}