日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

vue-cropper組件實(shí)現(xiàn)圖片切割上傳

瀏覽:28日期:2022-09-29 11:11:58

本文實(shí)例為大家分享了vue-cropper組件實(shí)現(xiàn)圖片切割上傳的具體代碼,供大家參考,具體內(nèi)容如下

這幾日,等來了些空閑,用vue和spring boot實(shí)踐一次頭像上傳,因此記下了,望將來的開發(fā)有所幫助。

vue-cropper在vue中的引入

1、組件內(nèi)引入

import { VueCropper } from ’vue-cropper’ components: { VueCropper,},

2、全局引入

在main.js中配置如下代碼

import VueCropper from ’vue-cropper’ Vue.use(VueCropper)

3、使用示例

vue文件

<template> <el-dialog :visible.sync='dialogFormVisible' :close-on-click-modal='false' append-to-body > <label for='uploads'>選擇圖片</label> <input type='file' :value='imgFile' accept='image/png, image/jpeg, image/gif, image/jpg' @change='uploadImg($event, 1)' > <div style='margin-left:20px;'> <div :style='{’overflow’: ’hidden’, ’margin’: ’5px’}'><div : style='width: 40px;height: 40px;'> <img :src='http://www.b3g6.com/bcjs/previews.url' :style='previews.img'></div> </div> </div> <div class='cut'> <vueCropperref='cropper':img='option.img':outputSize='option.size':outputType='option.outputType':info='true':full='option.full':canMove='option.canMove':canMoveBox='option.canMoveBox':original='option.original':autoCrop='option.autoCrop':autoCropWidth='option.autoCropWidth':autoCropHeight='option.autoCropHeight':fixedBox='option.fixedBox'@realTime='realTime'@imgLoad='imgLoad' ></vueCropper> </div> <div slot='footer' class='dialog-footer'> <el-button @click='dialogFormVisible = false' size='small'>取 消</el-button> <el-button type='primary' @click='finish(’blob’)' size='small'>確 定</el-button> </div> </el-dialog></template><script>import { VueCropper } from 'vue-cropper';export default { components: { VueCropper }, data() { return { previews: {}, model: false, modelSrc: '', fileName: '', imgFile: '', dialogFormVisible: false, option: {img: '',outputSize: 1, //剪切后的圖片質(zhì)量(0.1-1)full: false, //輸出原圖比例截圖 props名fulloutputType: 'png',canMove: true,original: false,canMoveBox: true,autoCrop: true,autoCropWidth: 40,autoCropHeight: 40,fixedBox: true } }; }, methods: { //上傳圖片(點(diǎn)擊上傳按鈕) finish(type) { let selft = this; let formData = new FormData(); // 輸出 if (type === 'blob') {selft.$refs.cropper.getCropBlob(data => { let img = window.URL.createObjectURL(data); selft.model = true; selft.modelSrc = img; formData.append('file', data, selft.fileName); selft.$api.writer.userUpload(formData, r => { if (r.code) { selft.$alert.error(r.msg); } else { selft.$message({message: r.data.msg,type: 'success' }); selft.$store.state.userInfo = r.data.data; selft.dialogFormVisible = false; } });}); } else {this.$refs.cropper.getCropData(data => {}); } }, //選擇本地圖片 uploadImg(e, num) { console.log('uploadImg'); var selft = this; //上傳圖片 var file = e.target.files[0]; selft.fileName = file.name; if (!/.(gif|jpg|jpeg|png|bmp|GIF|JPG|PNG)$/.test(e.target.value)) {alert('圖片類型必須是.gif,jpeg,jpg,png,bmp中的一種');return false; } var reader = new FileReader(); reader.onload = e => {let data;if (typeof e.target.result === 'object') { // 把Array Buffer轉(zhuǎn)化為blob 如果是base64不需要 data = window.URL.createObjectURL(new Blob([e.target.result]));} else { data = e.target.result;}if (num === 1) { selft.option.img = data;} else if (num === 2) { selft.example2.img = data;} }; // 轉(zhuǎn)化為base64 // reader.readAsDataURL(file) // 轉(zhuǎn)化為blob reader.readAsArrayBuffer(file); }, show() { this.dialogFormVisible = true; }, // 實(shí)時(shí)預(yù)覽函數(shù) realTime(data) { console.log('realTime'); this.previews = data; }, imgLoad(msg) { console.log('imgLoad'); console.log(msg); } }};</script><style lang='less'>@import './userLogo.less';</style>

less文件

.cut { width: 300px; height: 300px; margin: 0px auto;}.hh { .el-dialog__header {padding: 0px;line-height: 2;background-color: #f3f3f3;height: 31px;border-bottom: 1px solid #e5e5e5;background: #f3f3f3;border-top-left-radius: 5px;border-top-right-radius: 5px; } .el-dialog__title {float: left;height: 31px;color: #4c4c4c;font-size: 12px;line-height: 31px;overflow: hidden;margin: 0;padding-left: 10px;font-weight: bold;text-shadow: 0 1px 1px #fff; } .el-dialog__headerbtn {position: absolute;top: 8px;right: 10px;padding: 0;background: 0 0;border: none;outline: 0;cursor: pointer;font-size: 16px; }}.btn { display: inline-block; line-height: 1; white-space: nowrap; cursor: pointer; background: #fff; border: 1px solid #c0ccda; color: #1f2d3d; text-align: center; box-sizing: border-box; outline: none; //margin: 20px 10px 0px 0px; padding: 9px 15px; font-size: 14px; border-radius: 4px; color: #fff; background-color: #50bfff; border-color: #50bfff; transition: all 0.2s ease; text-decoration: none; user-select: none;}.show-preview { flex: 1; -webkit-flex: 1; display: flex; display: -webkit-flex; justify-content: center; -webkit-justify-content: center; .preview {overflow: hidden;border-radius: 50%;border: 1px solid #cccccc;background: #cccccc; }}

發(fā)送請(qǐng)求的時(shí)候配置axios的Content-Type

// http request 攔截器axios.interceptors.request.use( config => {debugger let token = sessionStorage.getItem(’token’) if (token) { config.headers.Authorization = token; } if (config && config.url && config.url.indexOf(’upload’) > 0) { config.headers[’Content-Type’] = ’multipart/form-data’ } return config }, err => { return Promise.reject(err) })

boot的controller

@RequestMapping('/upload') public ResultData upload(@RequestParam('file') MultipartFile file) { return userService.upload(file); }

boot的service

@Override public ResultData upload(MultipartFile file) { if (!file.isEmpty()) { StringBuffer requestURL = sessionUtil.getRequestURL(); int end = requestURL.indexOf('/user/upload'); String basePath = requestURL.substring(0, end); String savePath = basePath + '/static/img/logo/'; // 獲取文件名稱,包含后綴 String fileName = file.getOriginalFilename(); String saveDbPath = savePath + fileName; // 存放在這個(gè)路徑下:該路徑是該工程目錄下的static文件下:(注:該文件可能需要自己創(chuàng)建) // 放在static下的原因是,存放的是靜態(tài)文件資源,即通過瀏覽器輸入本地服務(wù)器地址,加文件名時(shí)是可以訪問到的 String path = ClassUtils.getDefaultClassLoader().getResource('').getPath() + 'static/img/logo/'; // 該方法是對(duì)文件寫入的封裝,在util類中,導(dǎo)入該包即可使用,后面會(huì)給出方法 try { FileUtil.fileupload(file.getBytes(), path, fileName); // 接著創(chuàng)建對(duì)應(yīng)的實(shí)體類,將以下路徑進(jìn)行添加,然后通過數(shù)據(jù)庫操作方法寫入 User user = sessionUtil.getSessionUser(); user.setLogo(saveDbPath); User whereUser = new User(); whereUser.setId(user.getId()); ConfigHelper.upate(user, 'user', whereUser); Map<String, Object> map = new HashMap<>(); map.put('msg', '頭像修改成功'); map.put('data', user); return ResultData.ok(map); } catch (IOException e) { log.error('圖片上傳==》' + e.getMessage()); e.printStackTrace(); return ResultData.failed(e.getMessage()); } catch (Exception e) { log.error('圖片上次==》' + e.getMessage()); e.printStackTrace(); return ResultData.failed(e.getMessage()); } } else { return ResultData.failed('上傳圖片失敗'); } }

結(jié)束

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Vue
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
在线日韩av| 黄色在线网站噜噜噜| 不卡av一区二区| 成人羞羞视频播放网站| 精品国产精品久久一区免费式| 日韩国产欧美视频| 免费看日韩精品| 免费一区二区视频| 亚洲手机视频| 99国产精品私拍| 日韩在线一区二区| 中文视频一区| 亚洲+小说+欧美+激情+另类| 一区二区三区四区日韩| 日韩精品一级| 国产日产精品_国产精品毛片| 国产一级成人av| 麻豆精品视频在线观看| 国产精品国产三级国产在线观看| 久久精品国产网站| 国产精品蜜芽在线观看| 色婷婷久久久| 国产精品毛片在线| 模特精品在线| 欧美亚洲人成在线| 麻豆精品视频在线观看视频| 国产成人77亚洲精品www| 欧美精品资源| 鲁大师影院一区二区三区| 日韩黄色av| 视频在线不卡免费观看| 亚洲高清影视| 日韩精品乱码av一区二区| 嫩呦国产一区二区三区av| 日本蜜桃在线观看视频| 91成人超碰| 亚洲aa在线| 麻豆91精品91久久久的内涵| 久久午夜影院| 久久久久国产一区二区| 久久亚洲风情| 久久99精品久久久久久园产越南| 欧美久久天堂| 日韩在线a电影| 国产精品黄色片| 亚洲播播91| 亚洲综合婷婷| 久久精品国产999大香线蕉| 亚洲www啪成人一区二区| 久久不射网站| 国产极品一区| 日韩精品一卡| 久久国产麻豆精品| 高清日韩欧美| 丝袜脚交一区二区| 麻豆一区二区三| 一区视频在线| 麻豆国产一区| 久久av在线| 国产一区二区三区免费在线 | 石原莉奈在线亚洲三区| 久久不卡日韩美女| 伊人影院久久| 免费一区二区三区在线视频| 九九综合九九| 国产精品videossex久久发布 | 日本一区二区中文字幕| 国产+成+人+亚洲欧洲在线| 麻豆9191精品国产| 久久久久久网| 日韩久久一区| 99久久99久久精品国产片果冰| 中文字幕日韩高清在线| 日韩中文影院| 国产精品毛片久久久| 国产精品91一区二区三区| 欧美精品国产一区| 黄页网站一区| 精品一区二区三区四区五区| 蜜桃传媒麻豆第一区在线观看| 成人片免费看| 国产精品久久久久77777丨| 三级亚洲高清视频| 欧美日韩在线网站| 精品成av人一区二区三区| 亚洲精品国产精品粉嫩| 99精品综合| 国产成人精品亚洲线观看| 91福利精品在线观看| 日韩亚洲在线| 日韩在线看片| 精品三区视频| 国产欧美一区二区三区国产幕精品 | 日韩精彩视频在线观看| 国产99亚洲| 成人影视亚洲图片在线| 久久激情av| 亚洲日韩视频| 亚洲欧洲一区| 亚洲高清二区| 涩涩av在线| 精品日本视频| 国产精品xxx| 国产日韩免费| 日本99精品| 亚洲伊人影院| 国产精品婷婷| 欧美日韩尤物久久| www.九色在线| 色爱综合网欧美| 黄色精品视频| 久久精品国产99国产| 欧美激情福利| 精品国产一级| 国产999精品在线观看| 精品资源在线| 成人午夜在线| 国产高潮在线| 日韩欧美在线中字| 日韩国产激情| 国产 日韩 欧美 综合 一区| 精品久久久久中文字幕小说| 美女在线视频一区| 久久精品网址| 麻豆国产在线| 成人看片网站| 在线一区电影| 一本色道精品久久一区二区三区| 精品一区毛片| 亚洲一区二区成人| 免费高清在线一区| 免费观看在线综合| 日韩精选在线| 国产探花一区二区| 美女国产一区二区三区| 久久gogo国模啪啪裸体| 久久99精品久久久久久园产越南| 欧美激情日韩| 天堂√中文最新版在线| 欧美日韩一二三四| 国产手机视频一区二区| 综合亚洲视频| 欧美日韩18| 精品国产午夜肉伦伦影院| 亚洲永久av| 不卡中文字幕| 亚洲91网站| 国产精品s色| 国产伦久视频在线观看| 99久久精品国产亚洲精品| 亚洲特级毛片| 天堂成人免费av电影一区| 日韩在线观看一区二区三区| 欧美三区不卡| 精品色999| 亚洲不卡av不卡一区二区| 一区二区亚洲精品| 91嫩草精品| 精品久久久久久久| 91精品国产成人观看| 亚洲在线观看| 国产亚洲一区| 91av亚洲| 免费久久精品视频| 国产精品第十页| 欧美男人天堂| 六月丁香综合| 国产精品www994| 在线日韩一区| 日韩三级视频| 成午夜精品一区二区三区软件| 999久久久国产精品| 亚洲久久视频| 高清久久精品| 丝袜诱惑制服诱惑色一区在线观看 | 欧美va亚洲va日韩∨a综合色| 亚洲午夜久久| 精品精品国产三级a∨在线| 999精品在线| 日本成人精品| 97精品国产一区二区三区| 亚洲在线观看| 精品理论电影在线| 国产视频一区三区| 免费在线亚洲欧美| 在线精品视频在线观看高清| 久久国内精品自在自线400部| 成人免费网站www网站高清| 综合国产精品| 国产传媒在线| 亚洲毛片网站| 国产激情在线播放| 免费日本视频一区| 成人av三级| 日本伊人久久| 极品裸体白嫩激情啪啪国产精品| 日本欧美韩国一区三区| 欧美~级网站不卡| 欧美激情福利| 亚洲影视一区二区三区|