canvas生成姓氏头像,上传七牛后传给后端

canvas生成姓氏头像,上传七牛后传给后端

1.需求:像苹果手机的通讯录一样,如果没有上传头像就读取他的姓氏。
需要前端生成头像后先上传七牛,将拿到的资源id传给后端存到数据库,用于之后的信息读取
2.效果图:

3.实现
大家有听过html2canvas吗?刚开始拿到需求的时候我首先想到的是html2canvas,试过之后发现并不是很合适,这个更偏向于将dom元素转化成图片,而我们需要的是创建图片并用文字填充,最后觉得还是canvas更简单,话不多说,上代码,我的项目用的是vue,这里以vue为例:
实现思路:在姓氏改变的时候生成头像,之后上传

<el-form size="small" ref="form" :model="form" :rules="rule" label-position="top" label-width="80px" @submit.native.prevent>
			<el-row>
				<el-col >
					<el-form-item label="姓氏" prop="lastName">
						<el-input  v-model="form.lastName" @change="lastFirstChangeEvent"></el-input>
					</el-form-item>
				</el-col>
			</el-row>
			<el-row v-if="form.lastName||form.portrait">
				<el-col >
					<el-form-item label="头像" prop="portraitResourceId">
						<div id="head-img"></div>
					</el-form-item>
				</el-col>
			</el-row>
		</el-form>
lastFirstChangeEvent(params) {
				var that = this;
				var colorList = ["#0077FF", "#5FADF3", "#5952BB", "#843952", "#ea4c89", "#F2292B", "#FFC89B", "#4C09C1", "#FEA701", "#9f7563", "#00CB00", "#A2CB00", "#50E3C2", "#9FA6C7"];
				var colorIdx = Math.floor(Math.random() * 10);
				var colorRgba = colorList[colorIdx]; //数组随机颜色
				var canvas = document.createElement('canvas');
				if(canvas == null) return false;
				canvas.width = 88;
				canvas.height = 88;
				var context = canvas.getContext('2d');
				context.fillStyle = colorRgba;//背景色,这里是给头像随机生成个背景色
				context.fillRect(0, 0, 88, 88); //正方形左上角的x,y,宽,高
				context.font = "30px sans-serif"; //文本字体大小
				context.fillStyle = "#FFFFFF"; //文本字体颜色
				context.textAlign = 'center'; //文本水平对齐方式
				context.textBaseline = 'middle'; //文本垂直方向,基线位置 
				context.fillText(that.form.lastName, 44, 44); //文本内容,X,Y坐标开始
				var idName = document.getElementById('head-img');
				idName.innerHTML = '';
				idName.appendChild(canvas);//将生成的头像放到写好的dom
				//下面是上传七牛前准备,如果没有后面的需求到此就结束了
				canvas.toBlob((blob)=>{
		              let filename = new Date().getTime()+".png";
		              that.filesParmas.files={
		               name: filename,
		               raw:new File([blob], filename, {type: 'image/png',name: filename}),
		               self:true
		              };
		              that.getQiniuCallbackUpToken();//上传七牛前需要想后端获取token
		         });
			},
			//			    异步上传token
			getQiniuCallbackUpToken(row) {
				var that = this;
				this.axiosXHR({
					type: "get",
					url: "/file/getQiniuCallbackUpToken",
					params: {
						bucketName: "PIC",
						originName: this.files.name
					},
					success: function(res) {
						that.fileLoad(res.data.data,row);
					}
				})
			},
			//			    上传青牛服务器
			fileLoad(backData,row) {
				if(backData.uploadUrl){
					params= params|| {};
					var filesParmas=this.filesParmas;
					let param = new FormData(); //创建form对象
					param.append('token', backData.token); //通过append向form对象添加数据 
					param.append('key', backData.key); //通过append向form对象添加数据 
					param.append('x:boolPublic', true); //通过append向form对象添加数据 
					param.append('x:description', filesParmas.description); //通过append向form对象添加数据 
					param.append('file', filesParmas.files.raw); //通过append向form对象添加数据 
					param.append('x:originName',filesParmas.files.raw.name);
					let config = {
						headers: {
							'Content-Type': 'multipart/form-data'
						}
					};   
					this.$http.post(backData.uploadUrl, param, config)
						.then(res => {
							if(res.data.status == 0) {
								//成功
							} else {
								//失败
							}
						})
				}else{
					//失败
				}
			}

搞定!!!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值