环境:
微信小程序原生、vant-ui、we-cropper
1、引入 we-cropper
https://github.com/we-plugin/…
下载后,找到 dist 文件夹,把外面三个文件复制到本人的我的项目中
2、在须要上传头像的中央写点击事件,获取到门路之后跳转到裁剪页面
setPhotoInfo() {
wx.chooseMedia({
count: 1, // 默认 9
sizeType: ['compressed'], // 能够指定是原图还是压缩图,默认二者都有
sourceType: ['album', 'camera'], // 能够指定起源是相册还是相机,默认二者都有
mediaType: ['image'], // 可选上传类型,此处只让选图片
success(res) {const src = res.tempFiles[0].tempFilePath
// 获取裁剪图片资源后,给 data 增加 src 属性及其值
wx.navigateTo({url: '/pages/user/clipHeadImg/index?src=' + src,})
}
})
}
3、在目录中新建一个页面用来裁剪
在 index.wxml 中引入 we-cropper.wxml
<!--pages/user/clipHeadImg/index.wxml-->
<import src="../../../utils/weCropper/we-cropper"></import> // 之前复制过去的 we-cropper.wxml 文件的地位
<view class="cropper-wrapper">
<template is="we-cropper" data="{{...cropperOpt}}"/>
<cover-view class="cropper-buttons" style="color: {{cropperOpt.boundStyle.color}}">
<cover-view
class="upload btn"
bindtap="cancel">
勾销
</cover-view>
<cover-view
class="upload btn"
bindtap="getCropperImage">
上传
</cover-view>
</cover-view>
</view>
在 index.wxss 中
/* pages/user/clipHeadImg/index.wxss */
.cropper{
position: absolute;
top: 0;
left: 0;
}
.cropper-buttons{background-color: rgba(0, 0, 0, 0.95);
}
.btn{color: #ffffff;}
.cropper-buttons{
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 80px;
padding: 0 20rpx;
box-sizing: border-box;
line-height: 80px;
z-index: 9999999 !important;
}
在 index.js 中
import WeCropper from '../../../utils/weCropper/we-cropper' // 之前复制过去的 we-cropper.js 的地位
const app = getApp()
const device = wx.getSystemInfoSync()
const width = device.windowWidth
const height = device.windowHeight - 80
cropperOpt: {
id: 'cropper',
targetId: 'targetCropper',
pixelRatio: device.pixelRatio,
width,
height,
scale: 2.5,
zoom: 8,
cut: {x: (width - 300) / 2,
y: (height - 260) / 2,
width: 300,
height: 260
},
boundStyle: {
color: "green",
mask: 'rgba(0,0,0,0.8)',
lineWidth: 1
}
}
在 onLoad 中实例化
onLoad(option) {
const {cropperOpt} = this.data
cropperOpt.src = option.src
cropperOpt.boundStyle.color = "green"
this.setData({cropperOpt})
this.cropper = new WeCropper(cropperOpt)
.on('ready', (ctx) => {})
.on('beforeImageLoad', (ctx) => {
wx.showToast({
title: '上传中',
icon: 'loading',
duration: 20000
})
})
.on('imageLoad', (ctx) => {wx.hideToast()
})
}
接下来就是事件
touchStart(e) {this.cropper.touchStart(e)
},
touchMove(e) {this.cropper.touchMove(e)
},
touchEnd(e) {this.cropper.touchEnd(e)
},
// 点击勾销,返回上一页
cancel() {setTimeout(() => {
wx.navigateBack({delta: 1})
}, 1000)
},
上面这一步是重中之重,上传图片到本人的服务器(最初取得的是一个链接)
getCropperImage() {this.cropper.getCropperImage()
.then((src) => {const nameLast = src.substring(src.lastIndexOf('.') + 1)
const timeStamp = new Date().getTime()
const fileName = `${timeStamp}.${nameLast}`
const clientName = `/project/bidding/${fileName}`
stsOss('yiyong-pub').then(res => {if (res.data.code === 200) {
const ossData = res.data.data
wx.uploadFile({
url: ossData.host, // 开发者服务器的 URL。filePath: src,
name: 'file', // 必须填 file。formData: {
key: 'project/bidding/' + fileName,
policy: ossData.policy,
OSSAccessKeyId: ossData.accessid,
signature: ossData.signature,
// 'x-oss-security-token': securityToken // 应用 STS 签名时必传。},
success: (res) => {if (res.statusCode === 204) {
// 获取加载的页面
let pages = getCurrentPages();
// 获取前一个页面的对象
let page = pages[pages.length - 2];
if (page.refreshHeadImg) {page.refreshHeadImg(ossData.host + clientName)
}
setTimeout(() => {
wx.navigateBack({delta: 1,})
}, 1000)
} else {Toast.fail('上传失败,请稍后重试')
}
},
fail: err => {console.log(err);
}
});
} else {Toast.fail(res.data.msg)
}
})
})
.catch((err) => {
wx.showModal({
title: '舒适提醒',
content: err.message
})
})
},
至此,整个过程完结。
特地注明:
这里应用 <cover-view> 标签的起因:
因为在这里引入了 we-cropper.wxml 文件,这个文件外面是 <canvas> 标签,所以咱们写 view、标签和 button 标签会被 cavans 标签笼罩,真机下面勾销、上传按钮下面会有蒙层遮挡,按钮点击不了,所以要用 cover-view 标签