vue 2.0 elemnt ui + vue-cropper 實(shí)現(xiàn)單圖裁剪上傳

1.安裝

npm install vue-cropper

2.在任意地方創(chuàng)建一個(gè)cropper.vue 組件

<template>

??<div>

????<div?class="cropper-content">

??????<!--?剪裁框?-->

??????<div?class="cropper">

????????<vueCropper?ref="cropper"?:img="option.img"?:outputSize="option.size"?:outputType="option.outputType"?:info="true"?:full="option.full"?:centerBox="option.centerBox"?:canMove="option.canMove"?:canMoveBox="option.canMoveBox"?:original="option.original"?:autoCrop="option.autoCrop"?:autoCropWidth="option.autoCropWidth"?:autoCropHeight="option.autoCropHeight"?:fixedBox="option.fixedBox"?@realTime="realTime"?:fixed="option.fixed"?:fixedNumber="fixedNumber"></vueCropper>

????????<!--?<vueCropper?ref="cropper"?:img="option.img"?:outputSize="option.size"?:outputType="option.outputType"></vueCropper>?-->

??????</div>

??????<!--?預(yù)覽框?-->

??????<div?class="show-preview"?:style="{'width':?'500px',?'height':?'400px',??'overflow':?'hidden',?'margin':?'0?25px',?'display':'flex',?'align-items'?:?'center'}">

????????<div?:style="previews.div"?class="preview">

??????????<img?:src="previews.url"?:style="previews.img">

????????</div>

??????</div>

????</div>

????<div?class="footer-btn">

??????<!--?縮放旋轉(zhuǎn)按鈕?-->

??????<div?class="scope-btn">

????????<el-button?type="primary"?icon="el-icon-zoom-in"?@click="changeScale(1)"></el-button>

????????<el-button?type="primary"?icon="el-icon-zoom-out"?@click="changeScale(-1)"></el-button>

??????????<el-button?type="primary"?@click="rotateRight">順時(shí)針旋轉(zhuǎn)</el-button>

????????<el-button?type="primary"?@click="rotateLeft">逆時(shí)針旋轉(zhuǎn)</el-button>

??????</div>

??????<!--?確認(rèn)上傳按鈕?-->

??????<div?class="upload-btn">

????????<!--?<el-button?type="primary"?@click="uploadImg('blob')">上傳</el-button>?-->

????????<el-button?type="primary"?:disabled="isDisabled"?@click="uploadImg('base64')">上傳</el-button>

??????</div>

????</div>

??</div>

</template>

<script>

import?{?VueCropper?}?from?'vue-cropper';

//?console.log(VueCropper);

export?default?{

??data?()?{

????return?{

??????previews:?{},?//?預(yù)覽數(shù)據(jù)

??????option:?{

????????img:?'',?//?裁剪圖片的地址??(默認(rèn):空)

????????outputSize:?1,?//?裁剪生成圖片的質(zhì)量??(默認(rèn):1)

????????full:?false,?//?是否輸出原圖比例的截圖?選true生成的圖片會(huì)非常大??(默認(rèn):false)

????????outputType:?'jpg',?//?裁剪生成圖片的格式??(默認(rèn):jpg)

????????canMove:?true,?//?上傳圖片是否可以移動(dòng)??(默認(rèn):true)

????????original:?false,?//?上傳圖片按照原始比例渲染??(默認(rèn):false)

????????canMoveBox:?true,?//?截圖框能否拖動(dòng)??(默認(rèn):true)

?????????centerBox:?true,?//?截圖框是否被限制在圖片里面

????????autoCrop:?true,?//?是否默認(rèn)生成截圖框??(默認(rèn):false)

????????autoCropWidth:?500,?//?默認(rèn)生成截圖框?qū)挾??(默認(rèn):80%)

????????autoCropHeight:?400,?//?默認(rèn)生成截圖框高度??(默認(rèn):80%)

????????fixedBox:?false,?//?固定截圖框大小?不允許改變??(默認(rèn):false)

????????fixed:?false,?//?是否開啟截圖框?qū)捀吖潭ū壤??(默認(rèn):true)

????????fixedNumber:?[1.5,?1],?//?截圖框比例??(默認(rèn):[1:1])

????????enlarge:?1

??????},

??????isDisabled:?false,

??????downImg:?'#'

????};

??},

??props:?['imgFile',?'fixedNumber','autoCropWH',],

??methods:?{

????changeScale?(num)?{

??????//?圖片縮放

??????num?=?num?||?1;

??????this.$refs.cropper.changeScale(num);

????},

????rotateLeft?()?{

??????//?向左旋轉(zhuǎn)

??????this.$refs.cropper.rotateLeft();

????},

????rotateRight?()?{

??????//?向右旋轉(zhuǎn)

??????this.$refs.cropper.rotateRight();

????},

????Update?()?{

???????this.option.autoCropWidth??=?this.autoCropWH.w???this.autoCropWH.w?:?500

????????this.option.autoCropHeight??=?this.autoCropWH.h???this.autoCropWH.h?:?400

??????this.option.img?=?this.imgFile.url;

????},

????realTime?(data)?{

??????//?實(shí)時(shí)預(yù)覽

??????this.previews?=?data;

????},

????uploadImg?(type)?{

??????//?將剪裁好的圖片回傳給父組件

??????event.preventDefault();

??????this.isDisabled?=?true;

??????let?that?=?this;

??????if?(type?===?'blob')?{

????????this.$refs.cropper.getCropBlob(data?=>?{

??????????that.$emit('upload',?data);

????????});

??????}?else?{

????????this.$refs.cropper.getCropData(data?=>?{

??????????that.$emit('upload',?data);

????????});

??????}

????}

??},

??components:?{?VueCropper?}

};

</script>

<style>

.cropper-content?{

??display:?flex;

??display:?-webkit-flex;

??justify-content:?flex-end;

??-webkit-justify-content:?flex-end;

}

.cropper-content?.cropper?{

??width:?500px;

??height:?400px;

}

.cropper-content?.show-preview?{

??flex:?1;

??-webkit-flex:?1;

??display:?flex;

??display:?-webkit-flex;

??justify-content:?center;

??-webkit-justify-content:?center;

??overflow:?hidden;

??border:?1px?solid?#cccccc;

??background:?#cccccc;

??margin-left:?40px;

}

.preview?{

??overflow:?hidden;

??border:?1px?solid?#cccccc;

??background:?#cccccc;

}

.footer-btn?{

??margin-top:?30px;

??display:?flex;

??display:?-webkit-flex;

??justify-content:?flex-end;

??-webkit-justify-content:?flex-end;

}

.footer-btn?.scope-btn?{

??width:?412px;

??display:?flex;

??display:?-webkit-flex;

??justify-content:?space-between;

??-webkit-justify-content:?space-between;

}

.footer-btn?.upload-btn?{

??flex:?1;

??-webkit-flex:?1;

??display:?flex;

??display:?-webkit-flex;

??justify-content:?center;

??-webkit-justify-content:?center;

}

.footer-btn?.btn?{

??outline:?none;

??display:?inline-block;

??line-height:?1;

??white-space:?nowrap;

??cursor:?pointer;

??-webkit-appearance:?none;

??text-align:?center;

??-webkit-box-sizing:?border-box;

??box-sizing:?border-box;

??outline:?0;

??margin:?0;

??-webkit-transition:?0.1s;

??transition:?0.1s;

??font-weight:?500;

??padding:?8px?15px;

??font-size:?12px;

??border-radius:?3px;

??color:?#fff;

??background-color:?#67c23a;

??border-color:?#67c23a;

}

</style>

3.結(jié)合elemnt ui 使用組件

<template>

??<div>

???????<el-upload

????????????:action="uploadUrl()"

????????????accept="image/png,image/jpg,image/jpeg"

????????????list-type="picture-card"

????????????:limit='1'

????????????:auto-upload="false"

????????????:on-preview="handlePictureCardPreview"

????????????:http-request="upload"

????????????:on-change="consoleFL"

????????????:file-list="uploadList"

????????????>

????????????<i?class="el-icon-plus"></i>

????????????</el-upload>

????????????<el-dialog?:visible.sync="dialogVisible">

????????????<img?width="100%"?:src="dialogImageUrl"?alt="">

????????????</el-dialog>

????????????<!--?剪裁組件彈窗?-->

????????????<el-dialog?:visible.sync="cropperModel"?width="1100px"?:before-close="beforeClose">

????????????<Cropper?:img-file="upfile"?:autoCropWH='autoCropWH'?ref="vueCropper"?:fixedNumber="fixedNumber"?@upload="upload">

????????????</Cropper>

????????????</el-dialog>

??</div>

</template>

<script>

import?Cropper?from?'../../common/cropper';

import?{?showLoading,?hideLoading,regular,Rodmo}?from?'../../../utils/loading.js'

??export?default?{

????data()?{

??????return?{

????????upfile:?'',?//?當(dāng)前被選擇的圖片文件

????????autoCropWH:{w:89,h:89},//裁剪的寬高

????????uploadList:[],?//圖片顯示列表

????????fixedNumber:?[1.5,?1],//?剪裁框比例設(shè)置

????????dialogImageUrl:?'',?

????????dialogVisible:?false,

????????cropperModel:?false,?//?剪裁組件彈窗開關(guān)

??????}

????},

?????updated?()?{

????????if?(this.$refs.vueCropper)?{

????????this.$refs.vueCropper.Update();

????????}

?????},

????components:?{?//注冊(cè)組件

????????Cropper

????},?

????methods:?{?

????????uploadUrl(){??//上傳路徑

?????????return '這里寫自己的路徑'

???????},

?????????beforeClose?()?{?//關(guān)閉彈窗

????????????this.cropperModel?=?false;

????????????},

???????consoleFL?(file,?fileList)?{//?彈出剪裁框哟楷,將當(dāng)前文件設(shè)置為文件

????????this.cropperModel?=?true;

????????this.upfile?=?file;

????????},

??????async?upload?(data)?{??//?自定義upload事件

????????let?fileimg?=?''

????????fileimg?=?await?this.base64ToFile(data,this.upfile.name)??//將base64圖片轉(zhuǎn)成文件類型

?????????if(fileimg?!=?''){

?????????????let?param?=?new?FormData()?

?????????????let?imgurl?=?window.URL.createObjectURL(fileimg)?//拿到截取的圖片數(shù)據(jù)路徑

??????????param.append('file',fileimg)??//添加FormData對(duì)象

??????????this.imgUpload(param,imgurl);

?????????}

????},

????handlePictureCardPreview(file)?{??//點(diǎn)擊文件列表中已上傳的文件時(shí)

??????????this.dialogImageUrl?=?file.url;

??????????this.dialogVisible?=?true;

????????},

????async?imgUpload(formData,imgurl)?{?//自定義圖片上傳

??????????let?url?=?this.uploadUrl()

????????this.$axios.post(url,formData,{?headers:?{?'Content-Type':?'multipart/form-data'?}?}).then(res?=>?{

????????????setTimeout(function()?{

????????????????hideLoading()

????????????},?200)

????????????if(!res.data.Code)?{

??????????????????let?p?=?{}

??????????????????p.url?=?imgurl?

??????????????????this.uploadList?=?[p]??//將截取的圖片數(shù)據(jù)路徑賦值給顯示數(shù)組

???????????????????this.$refs.vueCropper.isDisabled?=?false;

???????????????????this.$message({?message:?res.data.Msg,?type:?'success'?});?//elemnt?ui成功提示

????????????}?else?{

????????????????this.$alert(res.data.Msg,?'錯(cuò)誤提醒',?{

????????????????????confirmButtonText:?'確定',

????????????????????callback:?action?=>?{

????????????????????????}

????????????????????});

????????????????}

????????????})???

?????????????this.cropperModel?=?false;??//關(guān)掉彈窗

????????},

??base64ToFile(urlData,?fileName)?{?//將base64轉(zhuǎn)換為file

????????let?arr?=?urlData.split(',');

????????let?mime?=?arr[0].match(/:(.*?);/)[1];

????????let?bytes?=?atob(arr[1]);?//?解碼base64

????????let?n?=?bytes.length

????????let?ia?=?new?Uint8Array(n);

????????while?(n--)?{

????????????ia[n]?=?bytes.charCodeAt(n);

????????}

????????return?new?File([ia],?fileName,?{?type:?mime?});

????},

????},?

??}

</script>

<style>

</style>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末铃将,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌锨匆,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件港华,死亡現(xiàn)場(chǎng)離奇詭異脾歇,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)逗旁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門嘿辟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人痢艺,你說我怎么就攤上這事仓洼。” “怎么了堤舒?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵色建,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我舌缤,道長(zhǎng)箕戳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任国撵,我火速辦了婚禮陵吸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘介牙。我一直安慰自己壮虫,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著囚似,像睡著了一般剩拢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上饶唤,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天徐伐,我揣著相機(jī)與錄音,去河邊找鬼募狂。 笑死办素,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的祸穷。 我是一名探鬼主播性穿,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼雷滚!你這毒婦竟也來了季二?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤揭措,失蹤者是張志新(化名)和其女友劉穎胯舷,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绊含,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡桑嘶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了躬充。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逃顶。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖充甚,靈堂內(nèi)的尸體忽然破棺而出以政,到底是詐尸還是另有隱情,我是刑警寧澤伴找,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布盈蛮,位于F島的核電站,受9級(jí)特大地震影響技矮,放射性物質(zhì)發(fā)生泄漏抖誉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一衰倦、第九天 我趴在偏房一處隱蔽的房頂上張望袒炉。 院中可真熱鬧,春花似錦樊零、人聲如沸我磁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽夺艰。三九已至叛溢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間劲适,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來泰國打工厢蒜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留霞势,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓斑鸦,卻偏偏與公主長(zhǎng)得像愕贡,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子巷屿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355