1.FormData 物件的作用
- 模擬HTML表單,相當于將HTML表單映射成表單物件,自動將表單物件中的資料拼接成請求引數的格式
- 異步上傳二進制檔案
2.FormData 物件的使用
- 1.準備 html 表單
<form id="form">
<input type="text" name="username" />
<input type="password" name="password" />
<input type="button"/>
</form>
- 2.將 HTML 表單轉化為 formData 物件
var form = document.getElementById('form');
var formData = new FormData(form);
- 3.提交表單物件
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>
提交表單后列印結果

3.FormData 物件的實體方法
FormData 物件的實體方法有很多,可以在控制臺輸出formData物件看到它的實體物件,以下列舉四個常用的

- 1.獲取表單物件中屬性的值
formData.get('key');
- 2.設定表單物件中屬性的值
formData.set('key', 'value');
- 3.洗掉表單物件中屬性的值
formData.delete('key');
- 4.向表單物件中追加屬性值
formData.append('key', 'value');
注意:set 方法與 append 方法的區別是,在屬性名已存在的情況下,set 會覆寫已有鍵名的值,append會保留兩個值,
4.FormData 二進制檔案上傳
- 二進制檔案上傳客戶端核心代碼
<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);
}
- FormData 檔案上傳進度展示
// 當用戶選擇檔案的時候
file.onchange = function () {
// 檔案上傳程序中持續觸發onprogress事件
xhr.upload.onprogress = function (ev) {
// 當前上傳檔案大小/檔案總大小 再將結果轉換為百分數
// 將結果賦值給進度條的寬度屬性
bar.style.width = (ev.loaded / ev.total) * 100 + '%';
}
}
- FormData 檔案上傳圖片即時預覽
在我們將圖片上傳到服務器端以后,服務器端通常都會將圖片地址做為回應資料傳遞到客戶端,客戶端可以從回應資料中獲取圖片地址,然后將圖片再顯示在頁面中,
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快樂!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/190696.html
標籤:java
