React使用react-cropper實現(xiàn)圖片裁剪上傳

由于實在太多人遇到了問題, 特意提供了一個小demo供大家參考, demo中分別用React的class component形式和Hooks形式實現(xiàn)了兩個同樣功能的圖片裁剪彈窗. 參考代碼地址: https://github.com/qhwc2009/copper-learn

你可以把demo工程clone下來到本地, 然后執(zhí)行$ yarn, 執(zhí)行完畢后再執(zhí)行$ yarn start啟動項目.

用到的組件

實現(xiàn)圖片裁切并上傳, 本文用到了:

  • html input標(biāo)簽的type=file屬性
  • react-cropper庫

實現(xiàn)步驟

1. 在外面的view頁面上, 利用input實現(xiàn)上傳的圖片暫存

 <label className="add-img-btn">
    <span>添加圖片</span>
    <input
      type="file"
      accept="image/jpeg,image/jpg,image/png"
      className="base-upload-input"
      onChange={this.handleFileChange}
    />
  </label>

可以把input 隱藏起來
之后, 把通過input上傳的文件暫存在state中

handleFileChange = (e) => {
    const file = e.target.files[0]

    if (file) {
      if (file.size <= MAX_FILE_SIZE) {
        
        this.setState({
          selectedImageFile: file,
        }, () => {
          this.setState({
            editImageModalVisible: true,
          })
        })
      } else {
        message.error("文件過大")
      }
    }

    e.target.value = ''
  }

2. 彈出圖片裁剪的Modal窗口(我把窗口抽離成了一個獨立的組件)

窗口可以自己寫, 這里貼出核心代碼
這里使用了react-cropper庫

彈出彈框來,之后
首先, 要把上一個步驟中儲存在state中的文件轉(zhuǎn)化成能讀取的URL
通過this.props.uploadedImageFile屬性把之前存的圖片傳進來, 讀取, 讀取完畢設(shè)置上src, 給下一步用

componentDidMount() {
    const fileReader = new FileReader()
    fileReader.onload = (e) => {
      const dataURL = e.target.result
      this.setState({src: dataURL})
    }

    fileReader.readAsDataURL(this.props.uploadedImageFile)
  }

接下來是圖片圖調(diào)用代碼
這里要使用上面讀取的src

            <Cropper
              src={this.state.src}
              className="company-logo-cropper"
              ref={cropper => this.cropper = cropper}
              // Cropper.js options
              viewMode={1}
              zoomable={false}
              aspectRatio={1}  // 這個是設(shè)置比例的參數(shù) 我這里設(shè)置的1:1
              guides={false}
              preview='.cropper-preview'
            />

重要的屬性:

  1. src - 目標(biāo)圖片的url
  2. 其他的options 可以參考這里 (react版與jQuery版options是相通的)
  3. cropper-preview 這里指定類名為cropper-preview的div作為預(yù)覽的窗口

3. 提交裁剪好的圖片

handleSubmit = () => {
    if (!this.state.submitting) {
      let url = `/homepage_images`
      // 拿到文件名
      let filename = this.props.uploadedImageFile.name

      message.info("正在上傳圖片")
      // TODO: 這里可以嘗試修改上傳圖片的尺寸
      this.cropper.getCroppedCanvas().toBlob(async blob => {
        // 創(chuàng)造提交表單數(shù)據(jù)對象
        const formData = new FormData()
        // 添加要上傳的文件
        formData.append('file', blob, filename)
        // 提示開始上傳
        this.setState({submitting: true})
        // 上傳圖片
        const resp = await http.post(url, formData)
        // 拿到服務(wù)器返回的數(shù)據(jù)
        this.props.onUploadedFile(resp.data.data)
        // 提示上傳完畢
        this.setState({submitting: false})
        // 關(guān)閉彈窗
        this.props.onClose()
      })
    }
  }
  1. 實現(xiàn)效果


    實現(xiàn)效果圖
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末褪猛,一起剝皮案震驚了整個濱河市近速,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌张抄,老刑警劉巖暖哨,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異取劫,居然都是意外死亡往湿,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門喻括,熙熙樓的掌柜王于貴愁眉苦臉地迎上來邀杏,“玉大人,你說我怎么就攤上這事双妨』床” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵刁品,是天一觀的道長泣特。 經(jīng)常有香客問我,道長挑随,這世上最難降的妖魔是什么状您? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮兜挨,結(jié)果婚禮上膏孟,老公的妹妹穿的比我還像新娘。我一直安慰自己拌汇,他們只是感情好柒桑,可當(dāng)我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著噪舀,像睡著了一般魁淳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上与倡,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天界逛,我揣著相機與錄音,去河邊找鬼纺座。 笑死息拜,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的净响。 我是一名探鬼主播少欺,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼馋贤!你這毒婦竟也來了狈茉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤掸掸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扰付,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡堤撵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了羽莺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片实昨。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖盐固,靈堂內(nèi)的尸體忽然破棺而出荒给,到底是詐尸還是另有隱情,我是刑警寧澤刁卜,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布志电,位于F島的核電站,受9級特大地震影響蛔趴,放射性物質(zhì)發(fā)生泄漏挑辆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一孝情、第九天 我趴在偏房一處隱蔽的房頂上張望鱼蝉。 院中可真熱鬧,春花似錦箫荡、人聲如沸魁亦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽洁奈。三九已至,卻和暖如春婉弹,著一層夾襖步出監(jiān)牢的瞬間睬魂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工镀赌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留氯哮,地道東北人。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓商佛,卻偏偏與公主長得像喉钢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子良姆,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,871評論 2 354

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理肠虽,服務(wù)發(fā)現(xiàn),斷路器玛追,智...
    卡卡羅2017閱讀 134,656評論 18 139
  • 我希望可以躺在向日葵上 即使沮喪悲傷 也能面向陽光
    琉_璃閱讀 261評論 8 1
  • 早上起來去上班税课,到了廠里通知我們機器還沒有搞好闲延,讓我們回去。郁悶昂妗垒玲! 出了廠里,我去銀行辦理業(yè)務(wù)找颓,先是淘寶的登錄密...
    月兒的2016閱讀 271評論 1 2
  • 【導(dǎo)讀】20年間击狮,馬云不斷地將電子商務(wù)的概念向世人推廣深入佛析,至今,電子商務(wù)充其量只占全球28萬億美元全球零售市場的...
    北斗書院閱讀 207評論 0 0
  • 感覺生活就像一個 又一個的牢籠 困住了人的一生 當(dāng)今天的破了 碎了 明天的以為你備好 以 人生為基礎(chǔ) 時間為鏈...
    鏡中女巫閱讀 81評論 0 0