ant design Upload組件的使用總結(jié)。

事先說明:upload 所使用"rc-upload"組件在npm是有單獨的包,upload對其進一步封裝吗讶。"rc-upload"

有更多的API選擇。

需求

要求限制上傳圖片的格式恋捆、大小照皆、分辨率。

簡單介紹

這是一個最簡單的upload組件使用

<Upload action="...">
    上傳
</Upload>

簡單說一下關(guān)鍵幾個參數(shù)

參數(shù) 作用
action 上傳的服務(wù)器地址沸停,使用默認(rèn)上傳行為必填
beforeUpload 默認(rèn)上傳行為之前的鉤子函數(shù)膜毁,用來限制上傳文件
customRequest 自定義上傳(本文關(guān)鍵)
fileList 已上傳列表

本文的關(guān)鍵就在于customRequest、fileList和onRemove三個api星立。

平常使用

該組件已經(jīng)將上傳文件封裝的及其簡單

<Upload action="..." onChange={...} beforeUpload={...}>
    上傳
</Upload>

在所有提供的鉤子函數(shù)都會接受file參數(shù)爽茴。它就是用戶上傳文件的RcFile形式葬凳。

主要參數(shù)有

{
   type     // 文件格式
   size     // 文件大小
   status   // 狀態(tài)有:uploading done error removed 只有在onChange事件才會變化
   response // 服務(wù)端響應(yīng)內(nèi)容绰垂,
}

在beforeUpload調(diào)用file的type和size來限制上傳文件。beforeUpload如果返回false就是取消上傳行為火焰。

來至官網(wǎng)的示例

function beforeUpload(file) {
  const isJPG = file.type === 'image/jpeg';
  if (!isJPG) {
    message.error('You can only upload JPG file!');
  }
  const isLt2M = file.size / 1024 / 1024 < 2;
  if (!isLt2M) {
    message.error('Image must smaller than 2MB!');
  }
  return isJPG && isLt2M;
}

當(dāng)文件開始上傳的時候劲装,這時候調(diào)用onChange 讀取到file.response獲取到服務(wù)端的回調(diào),來實現(xiàn)我們的功能。

進一步使用

  1. 顯然默認(rèn)的行為不能實現(xiàn)我的要求,file對象并沒有分辨率的參數(shù)占业。我所采用的是把上傳的圖片實例化讀取它的高寬绒怨。這樣出現(xiàn)一個問題。image只有在觸發(fā)load事件之后才能被讀取寬高谦疾,我們沒有辦法將我們的判斷傳遞給beforeUpload南蹂,也就阻止不了上傳事件。
const { file } = files
// files是customRequest參數(shù)
const reader = new FileReader();
    reader.addEventListener("load", e => {
      const data = e.target.result;
      //加載圖片獲取圖片真實寬度和高度
      const image = new Image();
      image.addEventListener("load", () => {
        const w = image.width;
        const h = image.height;
      });
      image.src = data;
    });
 reader.readAsDataURL(file);
// 我們傳遞不出false念恍。

所有只能使用customRequest來覆蓋默認(rèn)上傳六剥。但這樣有兩個弊端。

  1. 上傳狀態(tài)無法被onChange捕獲峰伙。

  2. 我們需要自己控制fileList疗疟。

  3. 組件showUploadList會出現(xiàn)我們不想展示的圖片。

其實到這一步已經(jīng)可以實現(xiàn)效果瞳氓,但是我想要組件的showUploadList所展示的上傳列表策彤,畢竟別人已經(jīng)寫好動畫了。

所有我們要控制fileList于state綁定匣摘,初始值設(shè)為[]店诗,上傳成功后fileList增加新的元素。

customRequest = (files) => {
    const { file } = files
    ...// 前面限制
    let formData = new FormData();
    formData.append("file", file);
    http('',formData).then(
       res =>
        this.setState(() => ({ fileList: [{ ...file }, { url, status: "done" }] }));
    )
}

設(shè)置的fileList是安裝官方defaultFileList 的形式添加的

{
    uid: '1',
    name: 'xxx.png',
    status: 'done',
    response: 'Server Error 500', // custom error message to show
    url: 'http://www.baidu.com/xxx.png',
  }

onRemove

使用了showUploadList就需要使用onRemove來刪除文件列表元素音榜。我們先看看onRemove的介紹

點擊移除文件時的回調(diào)必搞,返回值為 false 時不移除。支持返回一個 Promise 對象囊咏,Promise 對象 resolve(false) 或 reject 時不移除

由于同時涉及到表單我也用了Form組件恕洲,同樣也要使用Form組件的表單驗證。

onRemove = () => {
    this.setState(() => ({
        fileList: []
  }));
}

圖片是刪除里但是并沒有觸發(fā)Form的驗證梅割。Form都是靠表單的onChange來觸發(fā)的霜第。所有查了一下源碼。

handleRemove(file: UploadFile) {
    const { onRemove } = this.props;
    Promise.resolve(typeof onRemove === 'function' ? onRemove(file) : onRemove).then(ret => {
      // Prevent removing file
      if (ret === false) {
        return;
      }

      const removedFileList = removeFileItem(file, this.state.fileList);
      if (removedFileList) {
        this.onChange({
          file,
          fileList: removedFileList,
        });
      }
    });
  }

其中的 removeFileItem 如下

export function removeFileItem(file: UploadFile, fileList: UploadFile[]) {
  const matchKey = file.uid !== undefined ? 'uid' : 'name';
  const removed = fileList.filter(item => item[matchKey] !== file[matchKey]);
  if (removed.length === fileList.length) {
    return null;
  }
  return removed;
}

可以看出之前fileList已被我們設(shè)為[]户辞,removeFileItem 返回為null泌类,所以沒有觸發(fā)onChange。沒辦法底燎,我們只能自己觸發(fā)了,傳入?yún)?shù)上面的代碼已給出刃榨。

<Upload ref = ref => this.ref = ref>
    上傳
</Upload>

onRemove = () => {
    ...// 前面操作
    this.ref.onChange({file,[]})
}

至此我個人所有需求全部解決。但是我在逛github的Issues 的時候發(fā)現(xiàn)有人提這樣無法獲取上傳的進度双仍。

ajax是有原生獲取上傳文件進度的方法的枢希。我使用的是axios的onUploadProgress方法。

 onUploadProgress:(progressEvent) => { 
    const {lengthComputable, loaded, total} = progressEvent 
    lengthComputable, //是否能夠被讀取長度
    loaded// 已上傳,
    total //以下載    
 }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末朱沃,一起剝皮案震驚了整個濱河市苞轿,隨后出現(xiàn)的幾起案子茅诱,更是在濱河造成了極大的恐慌,老刑警劉巖搬卒,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瑟俭,死亡現(xiàn)場離奇詭異,居然都是意外死亡契邀,警方通過查閱死者的電腦和手機摆寄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來坯门,“玉大人椭迎,你說我怎么就攤上這事√镉” “怎么了畜号?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長允瞧。 經(jīng)常有香客問我简软,道長,這世上最難降的妖魔是什么述暂? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任痹升,我火速辦了婚禮,結(jié)果婚禮上畦韭,老公的妹妹穿的比我還像新娘疼蛾。我一直安慰自己,他們只是感情好艺配,可當(dāng)我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布察郁。 她就那樣靜靜地躺著,像睡著了一般转唉。 火紅的嫁衣襯著肌膚如雪皮钠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天赠法,我揣著相機與錄音麦轰,去河邊找鬼。 笑死砖织,一個胖子當(dāng)著我的面吹牛款侵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播侧纯,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼新锈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了茂蚓?” 一聲冷哼從身側(cè)響起壕鹉,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤剃幌,失蹤者是張志新(化名)和其女友劉穎聋涨,沒想到半個月后晾浴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡牍白,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年脊凰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茂腥。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡狸涌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出最岗,到底是詐尸還是另有隱情帕胆,我是刑警寧澤,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布般渡,位于F島的核電站懒豹,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏驯用。R本人自食惡果不足惜脸秽,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蝴乔。 院中可真熱鬧记餐,春花似錦、人聲如沸薇正。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挖腰。三九已至钠怯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間曙聂,已是汗流浹背晦炊。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留宁脊,地道東北人断国。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像榆苞,于是被迫代替她去往敵國和親稳衬。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理坐漏,服務(wù)發(fā)現(xiàn)薄疚,斷路器碧信,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • 上傳模塊配置樣例: # 上傳大小限制(包括所有內(nèi)容) client_max_body_size 100m; # 上...
    SkTj閱讀 13,084評論 0 3
  • 今天去兄弟學(xué)校交流學(xué)習(xí)砰碴,有幸分別聽了該校兩位語文老師的一節(jié)語文課,兩相對比板丽,感受頗深呈枉。 兩位語文教師,一男一...
    玲瓏簡書閱讀 499評論 1 0