微信公众号上传图片功能

该代码段展示了在微信公众号环境下,如何获取网页签名信息,并实现图片选择、上传及本地图片数据处理的功能。主要涉及`wx.config`进行微信JS接口配置,`wx.chooseImage`选择图片,`wx.getLocalImgData`获取本地图片Base64数据,以及使用Ajax进行图片上传。同时,代码中包含了错误处理和上传状态的显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//获取公众号网页签名信息
function getWxData() {
    var link = location.href;
    console.log(link)
    console.log("获取公众号网页签名信息");
    $.ajax({
        url: "...?url=" + link,//后台给你提供的接口
        async: false,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (datad) {
            wx.config({
                debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来
                appId: datad.AppId, // 必填,公众号的唯一标识
                timestamp: datad.timestamp, // 必填,生成签名的时间戳
                nonceStr: datad.nonceStr, // 必填,生成签名的随机串
                signature: datad.signature,// 必填,签名,见附录1
                jsApiList: [
                    "getLocation",
                    "chooseImage",
                    "getLocalImgData"
                ] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
            });
            flag = false;
        },
        error: function (error) {
            layer.msg(error)
        }
    });
    wx.ready(function(){
        // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
        getWxLocation();
    });
    //处理IOS端,公众号点击返回,再次点进去,上传不生效
    if(flag){
        window.location.reload();
    }
    wx.checkJsApi({
        jsApiList: [
            'getLocation',
            'getLocalImgData',
            'chooseImage'
        ],
        success: function (res) {
            bindClick();
        }
    });
}

function bindClick(){
    $('#file').on('click', function () {
        if ($('.new-preview') && $('.new-preview').length >= 5) {
            return alert('最多上传五张!');
        } else {
            wx.chooseImage({
                count: 5 - $('.new-preview').length, // 默认9
                sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
                sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
                success: function (res) {
                    console.log('++++++++++++++++++++++++++++++++++++++++++++++')
                    console.log(res);
                    // var localIds = res.localIds[0]; // 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片
                    // 开始上传
                    handlerUploadMask('上传中', 1000, 'uploading');
                    for (var i = 0; i < res.localIds.length; i++) {
                        if (i == res.localIds.length - 1) {
                            // 最后一次上传图片成功时,显示上传成功并关闭
                            getLocalImgData(res.localIds[i], true);
                        } else {
                            getLocalImgData(res.localIds[i]);
                        }
                    }
                }
            });
        }
    })
}

//获取本地图片
function getLocalImgData(localId, endIndex) {
    wx.getLocalImgData({
        localId: localId, // 图片的localID
        success: function (res) {
            console.log(res)
            //处理android的localData不包含data:image/png;base64
            let localData = (isIos() ? "" : "data:image/png;base64,") + res.localData; // localData是图片的base64数据,可以用img标签显示
            let blobData = dataURLtoBlob(localData);
            var formData = new FormData();
            formData.append("file", blobData);
            console.log('formData', formData);
            // 第一步
            $.ajax({
                url: '....', //请求的接口地址
                type: 'POST',
                cache: false, //上传文件不需要缓存
                data: formData,
                processData: false, // 不要去处理发送的数据
                contentType: false, // 不要去设置Content-Type请求头
                success: function (data) {
                    console.log(endIndex);
                    if (endIndex) {
                        handlerUploadMask('上传成功', 0.8, 'uploaded');
                    }
                    console.log('上传单张图片成功!', data);//对象数组
                    // alert(data[0].downUrl);
                    if (data.length) {
                        data.forEach(item => {
                            console.log('item', item);
                            if (item.downUrl !== null) {
                                // if (0) {
                                uploadArr.push(item.downUrl)
                                console.log(uploadArr, 'upArr');
                            } else {
                                $('.upload-img-error-mask').css('display', 'flex');
                                setTimeout(() => {
                                    $('.upload-img-error-mask').css('display', 'none');
                                }, 5000);
                                return;
                            }
                        })
                        //3、回显
                        let div = document.createElement("div"),
                            img = document.createElement("img"),
                            sonI = document.createElement("i");
                        div.className = "new-preview";
                        sonI.className = 'cancel-btn iconfont icon-guanbi'

                        img.src = localData;
                        div.appendChild(img);
                        div.appendChild(sonI);
                        $('.preview').prepend(div);

                    }
                },
                error: function (err) {
                    handlerUploadMask('上传图片失败', 0.8, 'error');
                    console.log('上传图片失败!', err)
                }
            })
        }
    });
}

// 判断设备为 ios
function isIos() {
    let u = navigator.userAgent;
    if (u.indexOf("iPhone") > -1 || u.indexOf("iOS") > -1) {
        return true;
    }
    return false;
}

function dataURLtoBlob(dataurl) {
    var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
        bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
    while (n--) {
        u8arr[n] = bstr.charCodeAt(n);
    }
    return new Blob([u8arr], {type: mime});
}

//上传中遮罩,这里加状态处理上传成功后隐藏掉loading图
function handlerUploadMask(content, duration, status) {
    $('.upload-mask-msg img').css('animation','rotateCircle 0.8s linear infinite');
    $('.upload-mask').css('display', 'flex').find('p').text(content);
    if (status == 'uploading') {
        // 上传中
        $('.upload-mask-msg').css('display', 'block').find('img').css('display', 'block');
    } else if (status == 'uploaded') {
        wordDeal();
    } else {
        wordDeal();
    }
    setTimeout(() => {
        $('.upload-mask').css('display', 'none');
    }, duration * 1000);
}
//上传成功或者失败文字居中
function wordDeal(){
    $('.upload-mask-msg').css('display', 'flex').find('img').css('display', 'none');
    $('.upload-mask-msg').css('justify-content', 'center');
    $('.upload-mask-msg').css('align-items', 'center');
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值