<form id="form">
<input type="text" name="username" />
<input type="password" name="password" />
<input type="button"/>
</form>
var form = document.getElementById('form');
var formData = new FormData(form);
xhr.send(formData);
注意:
1.Formdata 物件不能用於 get 請求,因為物件需要被傳遞到 send 方法中,而 get 請求方式的請求引數只能放在請求地址的後面。
2.伺服器端 bodyParser 模組不能解析 formData 物件表單資料,我們需要使用 formidable 模組進行解析。
// 引入express框架
const express = require('express');
// 路徑處理模組
const path = require('path');
const formidable = require('formidable');
// 建立web伺服器
const app = express();
app.post('/formData', (req, res) => {
// 建立formidable表單解析物件
const form = new formidable.IncomingForm();
// 解析使用者端傳遞過來的FormData物件
form.parse(req, (err, fields, files) => {
res.send(fields);
});
});
// 監聽埠
app.listen(3000);
// 控制檯提示輸出
console.log('伺服器啟動成功');
使用者端程式碼
<body>
//準備 HTML 表單
<form action="" id="form">
<input type="text" name="usernam">
<input type="password" name="password">
<input type="button" name="" id="btn" value="提交">
</form>
<script>
var btn = document.getElementById('btn');
var form = document.getElementById('form');
//新增點選事件
btn.onclick = function () {
//將 HTML 表單轉化為 formData 物件
var formData = new FormData(form);
var xhr = new XMLHttpRequest();
xhr.open('post','http://localhost:3000/formData');
//提交表單物件
xhr.send(formData);
xhr.onload = function () {
if(xhr.status = 200){
console.log(xhr.responseText);
}
}
}
</script>
</body>
提交表單後列印結果
FormData 物件的實體方法有很多,可以在控制檯輸出formData物件看到它的範例物件,以下列舉四個常用的
formData.get('key');
formData.set('key', 'value');
formData.delete('key');
formData.append('key', 'value');
注意:set 方法與 append 方法的區別是,在屬性名已存在的情況下,set 會覆蓋已有鍵名的值,append會保留兩個值。
<input type="file" id="file"/>
var file = document.getElementById('file')
// 當使用者選擇檔案的時候
file.onchange = function () {
// 建立空表單物件
var formData = new FormData();
// 將使用者選擇的二進位制檔案追加到表單物件中
formData.append('attrName', this.files[0]);
// 設定ajax物件,請求方式必須為post
xhr.open('post', 'www.example.com');
xhr.send(formData);
}
// 當使用者選擇檔案的時候
file.onchange = function () {
// 檔案上傳過程中持續觸發onprogress事件
xhr.upload.onprogress = function (ev) {
// 當前上傳檔案大小/檔案總大小 再將結果轉換為百分數
// 將結果賦值給進度條的寬度屬性
bar.style.width = (ev.loaded / ev.total) * 100 + '%';
}
}
在我們將圖片上傳到伺服器端以後,伺服器端通常都會將圖片地址做為響應資料傳遞到使用者端,使用者端可以從響應資料中獲取圖片地址,然後將圖片再顯示在頁面中。
xhr.onload = function () {
var result = JSON.parse(xhr.responseText);
var img = document.createElement('img');
img.src = result.src;
img.onload = function () {
document.body.appendChild(this);
}
}
// 實現檔案上傳的路由
app.post('/upload', (req, res) => {
// 建立formidable表單解析物件
const form = new formidable.IncomingForm();
// 設定使用者端上傳檔案的儲存路徑
form.uploadDir = path.join(__dirname, 'public', 'uploads');
// 保留上傳檔案的字尾名字
form.keepExtensions = true;
// 解析使用者端傳遞過來的FormData物件
form.parse(req, (err, fields, files) => {
// 將使用者端傳遞過來的檔案地址響應到使用者端
res.send({
path: files.attrName.path.split('public')[1]
});
});
});
使用者端程式碼
<body>
<div class="container">
<div class="form-group">
<label>請選擇檔案</label>
<input type="file" id="file">
<div class="padding" id="box">
<!-- <img src="" alt="" class="img-rounded img-responsive"> -->
</div>
<div class="progress">
<div class="progress-bar" style="width: 0%;" id="bar">0%</div>
</div>
</div>
</div>
<script>
var file = document.getElementById('file');
var bar = document.getElementById('bar');
var box = document.getElementById('box');
file.onchange = function(){
var formData = new FormData();
//將使用者選擇的檔案追叫到formData表單物件中
formData.append('attrName',this.files[0]);
var xhr = new XMLHttpRequest();
xhr.open('post','http://localhost:3000/upload');
//檔案上傳過程中持續觸發
xhr.upload.onprogress = function (ev) {
//ev.loaded 檔案上傳了多少
//ev.total 上傳檔案總大小
var result = (ev.loaded / ev.total) * 100 + '%';
bar.style.width = result;
//將百分比顯示子進度條中
bar.innerHTML = result;
}
xhr.send(formData);
xhr.onload = function () {
if(xhr.status == 200){
var result = JSON.parse(xhr.responseText);
//動態建立img標籤
var img = document.createElement('img');
img.src = result.path;
img.onload = function () {
//圖片載入完成後將圖片顯示在瀏覽器中
box.appendChild(img);
}
}
}
}
</script>
</body>
最後說一句:祝所有程式設計師1024快樂!!!