123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425 |
- <template>
- <view class="htz-image-upload-list">
- <view class="htz-image-upload-Item" v-for="(item,index) in uploadLists" :key="index">
- <image class="img" :src="item" @click="imgPreview(index)"></image>
- <view class="htz-image-upload-Item-del" v-if="remove" @click="imgDel(index)">×</view>
- </view>
- <view class="htz-image-upload-Item htz-image-upload-Item-add" v-if="uploadLists.length<max" @click="imgAdd">
- +
- </view>
- </view>
- </template>
- <script>
- export default {
- name: 'htz-image-upload',
- props: {
- max: { //展示图片最大值
- type: Number,
- default: 1,
- },
- chooseNum: { //选择图片数
- type: Number,
- default: 9,
- },
- name: { //发到后台的文件参数名
- type: String,
- default: 'file',
- },
- remove: { //是否展示删除按钮
- type: Boolean,
- default: true,
- },
- sourceType: { //选择照片来源 【ps:H5就别费劲了,设置了也没用。不是我说的,官方文档就这样!!!】
- type: Array,
- default: () => ['album', 'camera'],
- },
- action: { //上传地址
- type: String,
- default: '',
- },
- headers: { //上传的请求头部
- type: Object,
- default: () => {},
- },
- formData: { //HTTP 请求中其他额外的 form data
- type: Object,
- // default: () => {},
-
- },
- compress: { //是否需要压缩
- type: Boolean,
- default: true,
- },
- quality: { //压缩质量,范围0~100
- type: Number,
- default: 80,
- },
- value: { //受控图片列表
- type: Array,
- default: () => [],
- },
- uploadSuccess: {
- default: (res) => {
- return {
- success: false,
- url: ''
- }
- },
- }
- },
- data() {
- return {
- uploadLists: [],
- }
- },
- mounted: function() {
- this.$nextTick(function() {
- this.uploadLists = this.value;
- });
- },
- watch: {
- value(val, oldVal) {
- console.log('value',val, oldVal)
- this.uploadLists = val;
- },
- },
- methods: {
- imgDel(index) {
- uni.showModal({
- title: '提示',
- content: '您确定要删除么?',
- success: (res) => {
- if (res.confirm) {
- // this.uploadLists.splice(index, 1)
- // this.$emit("input", this.uploadLists);
- // this.$emit("imgDelete", this.uploadLists);
- let delUrl=this.uploadLists[index]
- this.uploadLists.splice(index, 1)
- this.$emit("input", this.uploadLists);
- this.$emit("imgDelete", {del:delUrl,tempFilePaths:this.uploadLists});
- } else if (res.cancel) {}
- }
- });
- },
- imgPreview(index) {
- console.log('imgPreview', index)
- console.log(this.uploadLists)
- uni.previewImage({
- urls: this.uploadLists,
- current: index,
- loop: true,
- });
- },
- imgAdd() {
- let nowNum = Math.abs(this.uploadLists.length - this.max);
- let thisNum = (this.chooseNum > nowNum ? nowNum : this.chooseNum) //可选数量
- // #ifdef APP-PLUS
- if (this.sourceType.length > 1) {
- uni.showActionSheet({
- itemList: ['从手机相册选择', '取消'],
- success: (res) => {
- if (res.tapIndex == 0) {
- this.appGallery(thisNum);
- } else if (res.tapIndex == 2) {
- this.appCamera();
- // this.appGallery(thisNum);
- }
- },
- fail: (res) => {
- console.log(res.errMsg);
- }
- });
- }
- if (this.sourceType.length == 1 && this.sourceType.indexOf('album') > -1) {
- this.appGallery(thisNum);
- }
- if (this.sourceType.length == 1 && this.sourceType.indexOf('camera') > -1) {
- this.appCamera();
- }
- // #endif
- //#ifndef APP-PLUS
- uni.chooseImage({
- count: thisNum,
- sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
- sourceType: this.sourceType,
- success: (res) => {
- this.chooseSuccessMethod(res.tempFilePaths)
- //console.log('tempFiles', res)
- // if (this.action == '') { //未配置上传路径
- // this.$emit("chooseSuccess", res.tempFilePaths);
- // } else {
- if (this.compress && (res.tempFiles[0].size / 1024 > 1025)) { //设置了需要压缩 并且 文件大于1M,进行压缩上传
- this.imgCompress(res.tempFilePaths);
- console.log('压缩文件')
- } else {
- this.imgUpload(res.tempFilePaths);
- console.log('直接上传')
- }
- // }
- }
- });
- // #endif
- },
- appCamera() {
- var cmr = plus.camera.getCamera();
- var res = cmr.supportedImageResolutions[0];
- var fmt = cmr.supportedImageFormats[0];
- //console.log("Resolution: " + res + ", Format: " + fmt);
- cmr.captureImage((path)=> {
- //alert("Capture image success: " + path);
- this.chooseSuccessMethod([path])
- },
- (error) =>{
- //alert("Capture image failed: " + error.message);
- console.log("Capture image failed: " + error.message)
- }, {
- resolution: res,
- format: fmt
- }
- );
- },
- appGallery(maxNum) {
- plus.gallery.pick((res) => {
- this.chooseSuccessMethod(res.files)
- }, function(e) {
- //console.log("取消选择图片");
- }, {
- filter: "image",
- multiple: true,
- maximum: maxNum
- });
- },
- chooseSuccessMethod(filePaths) {
- if (this.action == '') { //未配置上传路径
- this.$emit("chooseSuccess", filePaths);
- } else {
- console.log(this.compress,"-------------压缩")
- //#ifdef APP-PLUS
- this.imgUpload(filePaths);
- //hbuilder运行手机调试基座的时候去掉下边
- // if (this.compress) { //设置了需要压缩
- // this.imgCompress(filePaths);
- // console.log('11111111111111111')
- // } else {
- // this.imgUpload(filePaths);
- // console.log('oooooooooooooooooooooooooo')
- // }
- //#endif
- }
- },
- imgCompress(tempFilePaths) {
- console.log('CESJOJO')
- uni.showLoading({
- title: '压缩中...'
- });
- let compressImgs = [];
- let results = [];
- tempFilePaths.forEach((item, index) => {
- console.log(tempFilePaths,'========================')
- compressImgs.push(new Promise((resolve, reject) => {
-
- uni.compressImage({
- src: item,
- quality: this.quality,
- success: res => {
- //console.log('compressImage', res.tempFilePath)
- results.push(res.tempFilePath);
- console.log(1,'========================')
- resolve(res.tempFilePath);
- },
- fail: (err) => {
- //console.log(err.errMsg);
- reject(err);
- },
- complete: () => {
- //uni.hideLoading();
- }
- })
-
- this.canvasDataURL(item, {
- quality: this.quality / 100
- }, (base64Codes) => {
- //this.imgUpload(base64Codes);
- results.push(base64Codes);
- resolve(base64Codes);
- })
-
- }))
- })
- Promise.all(compressImgs) //执行所有需请求的接口
- .then((results) => {
- uni.hideLoading();
- this.imgUpload(results);
- })
- .catch((res, object) => {
- uni.hideLoading();
- });
- },
- imgUpload(tempFilePaths) {
- // if (this.action == '') {
- // uni.showToast({
- // title: '未配置上传地址',
- // icon: 'none',
- // duration: 2000
- // });
- // return false;
- // }
- console.log("测试上传次数")
- uni.showLoading({
- title: '上传中'
- });
- //console.log('imgUpload',tempFilePaths)
- let uploadImgs = [];
- tempFilePaths.forEach((item, index) => {
- uploadImgs.push(new Promise((resolve, reject) => {
- const uploadTask = uni.uploadFile({
- url: this.action, //仅为示例,非真实的接口地址
- filePath: item,
- name: this.name,
- fileType: 'image',
- formData: {
- file_type:'img'
- },
- header: this.headers,
- success: (uploadFileRes) => {
- console.log('first-------------------')
- // uni.hideLoading();
- //console.log(typeof this.uploadSuccess)
- //console.log('')
- if (typeof this.uploadSuccess == 'function') {
- if (this.uploadSuccess(uploadFileRes).success) {
- this.value.push(this.uploadSuccess(uploadFileRes).url)
- this.$emit("input", this.uploadLists);
- }
- console.log('成功')
- }
- resolve(uploadFileRes);
- this.$emit("uploadSuccess", uploadFileRes);
- },
- fail: (err) => {
- console.log(err);
- //uni.hideLoading();
- reject(err);
- this.$emit("uploadFail", err);
- },
- complete: () => {
- //uni.hideLoading();
- }
- });
- }))
- })
- Promise.all(uploadImgs) //执行所有需请求的接口
- .then((results) => {
- uni.hideLoading();
- })
- .catch((res, object) => {
- uni.hideLoading();
- this.$emit("uploadFail", res);
- });
- // uploadTask.onProgressUpdate((res) => {
- // //console.log('',)
- // uni.showLoading({
- // title: '上传中' + res.progress + '%'
- // });
- // if (res.progress == 100) {
- // uni.hideLoading();
- // }
- // });
- },
- canvasDataURL(path, obj, callback) {
- var img = new Image();
- img.src = path;
- img.onload = function() {
- var that = this;
- // 默认按比例压缩
- var w = that.width,
- h = that.height,
- scale = w / h;
- w = obj.width || w;
- h = obj.height || (w / scale);
- var quality = 0.8; // 默认图片质量为0.8
- //生成canvas
- var canvas = document.createElement('canvas');
- var ctx = canvas.getContext('2d');
- // 创建属性节点
- var anw = document.createAttribute("width");
- anw.nodeValue = w;
- var anh = document.createAttribute("height");
- anh.nodeValue = h;
- canvas.setAttributeNode(anw);
- canvas.setAttributeNode(anh);
- ctx.drawImage(that, 0, 0, w, h);
- // 图像质量
- if (obj.quality && obj.quality <= 1 && obj.quality > 0) {
- quality = obj.quality;
- }
- // quality值越小,所绘制出的图像越模糊
- var base64 = canvas.toDataURL('image/jpeg', quality);
- // 回调函数返回base64的值
- callback(base64);
- }
- },
- }
- }
- </script>
- <style>
- .htz-image-upload-list {
- display: flex;
- flex-wrap: wrap;
- }
- .htz-image-upload-Item {
- width: 200rpx;
- height:200rpx;
- margin: 13rpx;
- border-radius: 10rpx;
- line-height: 180rpx;
- position: relative;
- }
- .htz-image-upload-Item:first-child{
- margin-left: 5upx!important;
- }
- .htz-image-upload-Item:nth-child(4n){
- margin-left: 5upx!important;
- }
- .htz-image-upload-Item:nth-child(3n){
- margin-right: 5upx!important;
- }
- .htz-image-upload-Item image {
- width: 100%;
- height: 100%;
- border-radius: 10rpx;
- border: 1px solid #FF0000;
- }
-
-
- .htz-image-upload-Item-add {
- font-size: 105rpx;
- /* line-height: 160rpx; */
- text-align: center;
- /* border: 1px dashed #d9d9d9;
- color: #d9d9d9; */
- color: #e61916;
- border: 1px dashed #e61916;
- }
- .htz-image-upload-Item-del {
- background-color: #f5222d;
- font-size: 24rpx;
- position: absolute;
- width: 35rpx;
- height: 35rpx;
- line-height: 35rpx;
- text-align: center;
- top: -12rpx;
- right: -12rpx;
- border-radius: 50%;
- z-index: 100;
- color: #fff;
- }
- </style>
|