成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

antd 和 element上傳文件詳解與FormData詳解

Fundebug / 2097人閱讀

摘要:當(dāng)用戶完成選擇文件動(dòng)作時(shí),提交子頁(yè)面中的。從此我們上傳文件就歡欣鼓舞的來(lái)找了。因?yàn)榈暮诵氖菍?duì)象,異步的實(shí)現(xiàn)是通過(guò)一個(gè)對(duì)象,一般簡(jiǎn)稱(chēng)該對(duì)象對(duì)。這些回答基于自己理解,如有不妥,希望路過(guò)的大神輕噴,指正。

背景

平時(shí)工作中經(jīng)常會(huì)遇到需要上傳文件的情況,如果你用ant design 或者element ,它們都提供了上傳的組件。 我們分別來(lái)看一下element 和 antd 手動(dòng)上傳怎么處理:

ant design 手動(dòng)上傳文件

antd官網(wǎng)有手動(dòng)上傳的demo:
在這里簡(jiǎn)單寫(xiě)一寫(xiě)實(shí)現(xiàn),主要有 在jsx中引入U(xiǎn)pload組件,將 fileList 作為props傳入,fileList為選擇的文件列表,和 上傳函數(shù)的實(shí)現(xiàn)。

// jsx
 
// Upload 為上傳組件
//  handleUpload 的實(shí)現(xiàn) 使用 fetch 請(qǐng)求
const handleUpload = () {
    const formData = new FormData();
    fileList.forEach((file) => {   // fileList 是要上傳的文件數(shù)組
      formData.append("files[]", file);
    });
    
    fetch(url: "http:just.a.url.demo", {
      method: "POST",
      headers: {
            credentials: "same-origin"
          // "Content-Type": "multipart/form-data"  // 不要加上這個(gè)文件類(lèi)型說(shuō)明
      },
      body: formData
            
    })
    .then(response => response.json())
    .catch(error => console.error("Error:", error))
    .then(response => console.log("Success:", response));
}
Element 手動(dòng)上傳文件

element 和antd 不同,通過(guò)上傳組件拿回的數(shù)據(jù),element又封裝了一層,所以傳數(shù)據(jù)稍有不同。
以下是簡(jiǎn)單實(shí)現(xiàn):

// template

    選擇文件
    上傳文件

//  上傳實(shí)現(xiàn)

const handleUpload = () {
    const formData = new FormData();
    fileList.forEach((file) => {        
        formData.append("files[]", file.raw);  // 這里與antd 不同的是,文件真正數(shù)據(jù)為 file.raw 
    });
    
    fetch(url: "http:just.a.url.demo", {
      method: "POST",
      headers: {
            credentials: "same-origin"
          // "Content-Type": "multipart/form-data"  // 不要加上這個(gè)文件類(lèi)型說(shuō)明
      },
      body: formData
            
    })
    .then(response => response.json())
    .catch(error => console.error("Error:", error))
    .then(response => console.log("Success:", response));
}
想問(wèn)幾個(gè)問(wèn)題:

雖然可以找得demo把文件傳輸了出去,但是心里有幾個(gè)問(wèn)題,如下:

1. 問(wèn)什么傳文件需要用FormData格式呢?傳文件和傳一般數(shù)據(jù)有什么不一樣?

從傳文件的歷史來(lái)回答傳文件問(wèn)什么需要FormData 格式。

file 形式

在最開(kāi)始的時(shí)候,文件上傳的傳統(tǒng)形式是使用 表單元素file。參照下面的代碼:

  
    
       

它在chrome瀏覽器中是這個(gè)樣子:

選擇文件之后,點(diǎn)擊Upload 按鈕,文件開(kāi)始上傳。

iframe形式

使用form元素比較簡(jiǎn)單,但缺點(diǎn)也比較明顯:上傳同步、上傳完成頁(yè)面會(huì)刷新;
在HTML5出現(xiàn)之前,想要實(shí)現(xiàn)文件異步上傳,只能通過(guò)iframe+form實(shí)現(xiàn);
其原理是:文件上傳時(shí)在頁(yè)面中動(dòng)態(tài)創(chuàng)建一個(gè)iframe元素和一個(gè)form元素,并將form元素的target屬性指向動(dòng)態(tài)創(chuàng)建iframe元素。當(dāng)用戶完成選擇文件動(dòng)作時(shí),提交子頁(yè)面中的 form。這時(shí),iframe跳轉(zhuǎn),而父頁(yè)面沒(méi)有刷新。這使得上傳結(jié)束后,服務(wù)器處理結(jié)果返回到動(dòng)態(tài)iframe窗口而沒(méi)有刷新頁(yè)面;
具體code,這里不再枚舉,感興趣童鞋可以去 iframe+form 查看。

ajax + FormData 形式

哎呀,終于來(lái)到了現(xiàn)代社會(huì),并且見(jiàn)到了咱們的主角 FormData。 ajax 大家肯定都知道了,異步刷新,無(wú)需重新加載整個(gè)網(wǎng)頁(yè)的情況下,便能夠更新部分網(wǎng)頁(yè)。
那FormData 是什么呢? FormData是XMLHttpRequest Level 2添加的一個(gè)新接口,他可以 構(gòu)建類(lèi)似表單的鍵值對(duì), 也就是說(shuō)我們可以利用 FormData 來(lái)模擬表單控件,然后使用XMLHttpRequest的send()
方法來(lái)異步的提交這個(gè)"表單"。
看一下簡(jiǎn)單的使用 FormData傳文件的例子


        
    
    

選擇文件并上傳后,通過(guò)瀏覽器看看網(wǎng)絡(luò)情況。

答案

啰啰嗦嗦這么多,終于知道了為什么傳文件要用FormData了!!開(kāi)心,簡(jiǎn)單來(lái)說(shuō)就是,傳文件一開(kāi)始設(shè)計(jì)使用 form 來(lái)傳,但是呢,使用form默認(rèn)的上傳方式存在諸多問(wèn)題,比如同步啦,我想在上傳之前處理一下數(shù)據(jù)啦,這個(gè)時(shí)候FormData 就站出來(lái)了,大喊 我可以構(gòu)建類(lèi)似表單的鍵值對(duì),來(lái)模擬表單,發(fā)送的數(shù)據(jù)用我構(gòu)建的對(duì)象就可以上傳文件了。從此我們上傳文件就歡欣鼓舞的來(lái)找FormData了。
好了,另一個(gè)小問(wèn)題,文件和其他數(shù)據(jù)的不同,文件傳輸時(shí)是二進(jìn)制數(shù)據(jù),所以格式和一般數(shù)據(jù)不一樣。 我們的FormData大俠不僅可以傳文件也可以傳一般數(shù)據(jù)哦,當(dāng)然傳輸數(shù)據(jù)有很多種方式,比如get請(qǐng)求的時(shí)候跟在url后面。

2. 請(qǐng)求為什么要用fetch呢? 和過(guò)氣網(wǎng)紅Ajax 什么關(guān)系?和xhr 有什么關(guān)系呢?

認(rèn)真看過(guò)問(wèn)題1的回答,這個(gè)問(wèn)題就很簡(jiǎn)單了。fetch api 是一個(gè)提供請(qǐng)求資源(包括通過(guò)網(wǎng)絡(luò))的接口,它和xhr(XMLHttpRequest)類(lèi)似。
所以請(qǐng)求不是為什么要用fetch,而是fetch 只是一種方法,可以用fetch也可以用xhr(參考問(wèn)題一中的 ajax + FormData demo),他們邏輯上是‘并列’的。
至于問(wèn)和AJAX 什么關(guān)系,不如說(shuō) Ajax 和 xhr什么關(guān)系。因?yàn)锳jax的核心是XMLHttpRequest對(duì)象, Ajax異步的實(shí)現(xiàn)是通過(guò)new 一個(gè) XMLHttpRequest對(duì)象,一般簡(jiǎn)稱(chēng)該對(duì)象對(duì)xhr。所以這里 fetch 是Ajax或XMLHttpRequest的一個(gè)替代方案。

3. 為什么傳文件的時(shí)候,"content-type"不能指定 "multipart/form-data" 呢?

當(dāng)指定為"multipart/form-data"的時(shí)候,還需要指定 boundary=something。如果不指定則會(huì)自動(dòng)分配。

ps: 這些回答基于自己理解,如有不妥,希望路過(guò)的大神輕噴,指正。

FormData

MDN上這樣解釋FormData:
The FormData interface provides a way to easily construct a set of key/value pairs representing form fields and their values, which can then be easily sent using the XMLHttpRequest.send() method.It uses the same format a form would use if the encoding type were set to "multipart/form-data".
FormData 接口提供了一種方法,可以方便地構(gòu)造一組表示表單字段和它們的值的鍵值對(duì),然后可以使用XMLHtRPROQuest.send()方法輕松發(fā)送。如果一個(gè)表單設(shè)置編碼格式為 multipart/form-data, 這個(gè)表單將和FormData 使用相同的格式。

從頭說(shuō)起 FormData

XHR

fetch

MDN 這樣介紹Fetch,F(xiàn)etch API 是和XHR類(lèi)似的用于獲取資源(包括通過(guò)網(wǎng)絡(luò))的一種接口方法,但是 Fetch API提供了更強(qiáng)大更靈活的API。fetch()便是其中一個(gè)全局方法。

3.1 XHR(XMLHttpRequest) 和 fetch 什么關(guān)系?

Fetch和XHR平行關(guān)系,

3.2 fetch 和 FormData

先來(lái)看fetch()幾種常見(jiàn)的用法:

Uploading JSON data: POST JSON-encoded data.
var url = "https://example.com/profile";
var data = {username: "example"};

fetch(url, {
  method: "POST", // or "PUT"
  body: JSON.stringify(data), // data can be `string` or {object}!
  headers:{
    "Content-Type": "application/json"
  }
}).then(res => res.json())
.catch(error => console.error("Error:", error))
.then(response => console.log("Success:", response));
upload a file
var formData = new FormData();
var fileField = document.querySelector("input[type="file"]");

formData.append("username", "abc123");
formData.append("avatar", fileField.files[0]);

fetch("https://example.com/profile/avatar", {
  method: "POST",
  body: formData
})
.then(response => response.json())
.catch(error => console.error("Error:", error))
.then(response => console.log("Success:", response));

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/96386.html

相關(guān)文章

  • 圖片上傳方案詳解

    摘要:以往用到圖片上傳功能都是直接使用現(xiàn)成的插件,今天把其中用到的知識(shí)點(diǎn)整理一下。構(gòu)造函數(shù)返回一個(gè)新構(gòu)造的。事件及方法我們主要是用事件及方法,其他見(jiàn)處理事件。繼續(xù)使用上文的讀取圖片讀取完成是格式的圖片我們將上的設(shè)為讀取的結(jié)果即可實(shí)現(xiàn)預(yù)覽功能。 以往用到圖片上傳功能都是直接使用現(xiàn)成的插件,今天把其中用到的知識(shí)點(diǎn)整理一下。 知識(shí)點(diǎn)字典 input 標(biāo)簽之 file 類(lèi)型 FileReader ...

    glumes 評(píng)論0 收藏0
  • 圖片上傳方案詳解

    摘要:以往用到圖片上傳功能都是直接使用現(xiàn)成的插件,今天把其中用到的知識(shí)點(diǎn)整理一下。構(gòu)造函數(shù)返回一個(gè)新構(gòu)造的。事件及方法我們主要是用事件及方法,其他見(jiàn)處理事件。繼續(xù)使用上文的讀取圖片讀取完成是格式的圖片我們將上的設(shè)為讀取的結(jié)果即可實(shí)現(xiàn)預(yù)覽功能。 以往用到圖片上傳功能都是直接使用現(xiàn)成的插件,今天把其中用到的知識(shí)點(diǎn)整理一下。 知識(shí)點(diǎn)字典 input 標(biāo)簽之 file 類(lèi)型 FileReader ...

    Karuru 評(píng)論0 收藏0
  • 系統(tǒng)學(xué)習(xí)前端之FormData詳解

    摘要:概述類(lèi)型其實(shí)是在級(jí)定義的,它是為序列化表以及創(chuàng)建與表單格式相同的數(shù)據(jù)當(dāng)然是用于傳輸提供便利。如果是使用表單初始化,每一個(gè)表單字段對(duì)應(yīng)一條數(shù)據(jù),它們的屬性即為值,它們屬性對(duì)應(yīng)值。參考兼容性查詢(xún)高級(jí)程序設(shè)計(jì) FormData 1. 概述 FormData類(lèi)型其實(shí)是在XMLHttpRequest 2級(jí)定義的,它是為序列化表以及創(chuàng)建與表單格式相同的數(shù)據(jù)(當(dāng)然是用于XHR傳輸)提供便利。 2. ...

    jhhfft 評(píng)論0 收藏0
  • XMLHTTPRequest屬性、方法、事件大全&詳解

    摘要:屬性方法事件整理大全。有嚴(yán)格安全限制。值描述將設(shè)為空字符串與設(shè)置為相同,是默認(rèn)類(lèi)型實(shí)際上是。默認(rèn)值為空字符串只有當(dāng)為時(shí),對(duì)象上才有此屬性,此時(shí)才能調(diào)用,否則拋錯(cuò)。以下種情況下值都為空字符串請(qǐng)求未完成請(qǐng)求失敗。 XMLHTTPRequest屬性、方法、事件整理大全。 xhr 對(duì)象的方法 open(method:string, url:string, async?:boolean=tr...

    roadtogeek 評(píng)論0 收藏0
  • Vue實(shí)現(xiàn)Excel本地下載及上傳的方法詳解

      在開(kāi)發(fā)中,文件上傳下載是常見(jiàn)相關(guān)功能,現(xiàn)在就Excel在該功能進(jìn)行講述:  咱直接看代碼:  <divclass="import-main-content">   <divclass="import-main-button"@click="checkFile">   <divclass="imp...

    3403771864 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<