国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

Fundebug / 2076人閱讀

摘要:當用戶完成選擇文件動作時,提交子頁面中的。從此我們上傳文件就歡欣鼓舞的來找了。因為的核心是對象,異步的實現(xiàn)是通過一個對象,一般簡稱該對象對。這些回答基于自己理解,如有不妥,希望路過的大神輕噴,指正。

背景

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

ant design 手動上傳文件

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

// jsx
 
// Upload 為上傳組件
//  handleUpload 的實現(xiàn) 使用 fetch 請求
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"  // 不要加上這個文件類型說明
      },
      body: formData
            
    })
    .then(response => response.json())
    .catch(error => console.error("Error:", error))
    .then(response => console.log("Success:", response));
}
Element 手動上傳文件

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

// template

    選擇文件
    上傳文件

//  上傳實現(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"  // 不要加上這個文件類型說明
      },
      body: formData
            
    })
    .then(response => response.json())
    .catch(error => console.error("Error:", error))
    .then(response => console.log("Success:", response));
}
想問幾個問題:

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

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

從傳文件的歷史來回答傳文件問什么需要FormData 格式。

file 形式

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

  
    
       

它在chrome瀏覽器中是這個樣子:

選擇文件之后,點擊Upload 按鈕,文件開始上傳。

iframe形式

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

ajax + FormData 形式

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


        
    
    

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

答案

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

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

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

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

當指定為"multipart/form-data"的時候,還需要指定 boundary=something。如果不指定則會自動分配。

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

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)造一組表示表單字段和它們的值的鍵值對,然后可以使用XMLHtRPROQuest.send()方法輕松發(fā)送。如果一個表單設(shè)置編碼格式為 multipart/form-data, 這個表單將和FormData 使用相同的格式。

從頭說起 FormData

XHR

fetch

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

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

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

3.2 fetch 和 FormData

先來看fetch()幾種常見的用法:

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)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/96386.html

相關(guān)文章

  • 圖片上傳方案詳解

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

    glumes 評論0 收藏0
  • 圖片上傳方案詳解

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

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

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

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

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

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

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

    3403771864 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<