小程序多图上传并压缩,带预览删除功能

<view class="upload_view">
  <block wx:for="{{pics}}" wx:key="*this">     <view class="q_image_wrap">       <!-- 图片缩略图 -->       <image class="q_image" src="{{item}}" mode="aspectFill" data-idx="{{index}}" bindtap="handleImagePreview"></image>       <!-- 移除图片的按钮 -->       <view class="q_image_remover" data-idx="{{index}}" bindtap="removeImage">         <i-icon type="close" size="14" class="icon" />       </view>     </view>
  </block>   <view class='uploadImg_btn' bindtap="chooseImage" wx:if="{{pics.length < 9}}">     <image src="../../img/upload.png"></image>   </view> </view>
 //选择图片
    chooseImage(e) {
        console.log(e)
        var that = this;
        var pics = this.data.pics;
        //---------------------多张上传----------------------------------------------------------------------------------------
        wx.chooseImage({
            count: 9 - pics.length, // 最多可以选择的图片张数,默认9
            sizeType: ['original', 'compressed'], // original 原图,compressed 压缩图,默认二者都有
            sourceType: ['album', 'camera'], // album 从相册选图,camera 使用相机,默认二者都有
            success: function (photo) {
                //图片大小,限制10M以内
                for (var i = 0; i < photo.tempFiles.length; i++) {
                    if (photo.tempFiles[i].size >= 10 * 1024 * 1024) {
                        console.log('请上传10M以内的图片');
                        return;
                    }
                }
                var imgsrc = photo.tempFilePaths;
                //页面上展示的是原图片========pics数组
                pics = pics.concat(imgsrc);
                that.setData({
                    pics: pics
                });
                console.log(that.data.pics)
                that.getCanvasImg(0, 0, photo.tempFilePaths);  //进行压缩
            },
            fail: function () {
                // fail
            },
            complete: function () {
                // complete
            }
        })
    },
 //压缩并获取图片,这里用了递归的方法来解决canvas的draw方法延时的问题
    getCanvasImg: function (index, failNum, tempFilePaths) {
        var that = this;
        let imagesPress = that.data.imagesPress;
        if (index < tempFilePaths.length) {
            wx.getImageInfo({
                src: tempFilePaths[index],
                success: function (res) {
                    //---------利用canvas压缩图片--------------
                    var ratio = 2;
                    var canvasWidth = res.width //图片原始长宽
                    var canvasHeight = res.height
                    while (canvasWidth > 400 || canvasHeight > 400) {// 保证宽高在400以内
                        canvasWidth = Math.trunc(res.width / ratio)
                        canvasHeight = Math.trunc(res.height / ratio)
                        ratio++;
                    }
                    that.setData({
                        canvasWidth: canvasWidth,
                        canvasHeight: canvasHeight,
                    })
                    const ctx = wx.createCanvasContext('photo_canvas');
                    ctx.drawImage(tempFilePaths[index], 0, 0, canvasWidth, canvasHeight);
                    ctx.draw(false, function () {
                        index = index + 1;//上传成功的数量,上传成功则加1
                        wx.canvasToTempFilePath({
                            canvasId: 'photo_canvas',
                            success: function success(res) {
                                console.log('最终图片路径' + res.tempFilePath)//最终图片路径
                                imagesPress.push(res.tempFilePath);
                                console.log(that.data.imagesPress)
                                that.setData({
                                    imagesPress: imagesPress
                                })
                                that.uploadCanvasImg(res.tempFilePath);
                                that.getCanvasImg(index, failNum, tempFilePaths);
                            }, fail: function (e) {
                                failNum += 1;//失败数量,可以用来提示用户
                                that.getCanvasImg(inedx, failNum, tempFilePaths);
                            }
                        });
                    });
                }
            })

        }
    },
//上传图片
    uploadCanvasImg: function (canvasImg) {
        const {$Toast} = require('../../dist/base/index');
        var that = this;
        let attachmentId = that.data.attachmentId
        var tempImg = canvasImg;
        wx.showLoading({
            title: '上传中...',
        });
        wx.uploadFile({
            url: app.globalData.baseUrl + '/api/upload',//文件服务器的地址
            filePath: tempImg,
            header: {
                'Content-type': 'multipart/form-data',
                'token': wx.getStorageSync('token')
            },
            // formData: {
            // },
            name: 'file',
            success: function (res) {
                wx.hideLoading()
                $Toast({
                    content: '上传成功!'
                });
                console.log(res)
            }
        })
    },
//删除图片
    removeImage(e) {
        var that = this;
        var pics = that.data.pics;
        var imagesPress = that.data.imagesPress;
        // 获取要删除的第几张图片的下标
        const idx = e.currentTarget.dataset.idx
        // splice  第一个参数是下表值  第二个参数是删除的数量
        pics.splice(idx, 1)
        imagesPress.splice(idx, 1)
        this.setData({
            pics: pics,
            imagesPress: imagesPress
        })
        console.log(that.data.imagesPress)
    },
    //预览图片
    handleImagePreview(e) {
        const idx = e.target.dataset.idx
        const pics = this.data.pics
        wx.previewImage({
            current: pics[idx],  //当前预览的图片
            urls: pics,  //所有要预览的图片
        })
    },

 

posted @ 2019-06-14 14:46  林Clown  阅读(780)  评论(0编辑  收藏  举报