H5 使用input标签上传图片给后台

Posted edczjw-edison

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了H5 使用input标签上传图片给后台相关的知识,希望对你有一定的参考价值。

html代码:

<div class="hpk-showimg">
                <!-- 营业执照 -->
                <div class="idcardup">
                        <a href="javascript:;" class="a-upload">
                            <input v-if="ipshow" type="file" accept="image/*" name="file1" capture="camera" @change="upload">
                            <input v-else type="file" accept="image/*" name="file1" @change="upload">
                        </a>
                        <img :src="formData.busLicenseImgUrl"  v-if="idylength>0" class="id-img3">
                        <img src="../image/icon_completed_idcard.png"  v-if="idylength>0" class="id-img2">
                        <div class="rload" v-if="idylength>0" >点击重新上传</div>
                        <img v-else src="../image/idcard_yye@2x.png"  class="id-img">
                </div>
                <!-- 食品执照 -->
                <div class="idcardup1">
                        <a href="javascript:;" class="a-upload1">
                            <input v-if="ipshow"  type="file" accept="image/*" name="file2" capture="camera" @change="upload1">
                            <input v-else type="file" accept="image/*" name="file2" @change="upload1">
                        </a>
                        <img :src="formData.foodsLicenseImgUrl"  v-if="smflength>0" class="id-img3">
                        <img src="../image/icon_completed_idcard.png"  v-if="smflength>0" class="id-img2">
                        <div class="rload" v-if="smflength>0">点击重新上传</div>
                        <img  v-else src="../image/smfood.png"  class="id-img">
                </div>
            </div>

less:

.hpk-showimg{
    align-items: center;
    height: 20%;
    padding: .24rem .32rem;
    .idcardup {
        position: relative;
        text-align: center;
        background: #fff;
        float: left;
        width: 48.75% !important;
        height: 100.6% !important;
        .id-img { 
            width: 100% !important;
            height: 100.6% !important;
            margin: 0px auto;
            border-radius: .1rem;
        }
        // 钩号
        .id-img2{
            position: absolute;
            width: .92rem;
            height: .92rem;
            bottom: 1rem;
            left: calc( 50% - .46rem);
        }
        .id-img3 { 
            width: 100% !important;
            height: 100.6% !important;
            margin: 0px auto;
            border-radius: .1rem;
            opacity:0.4;
            filter:alpha(opacity=40); /*  IE8 及其更早版本 */
            position: relative;
            border: .02rem solid rgba(146, 139, 132, 0.721);
        }
        // 重新上传文本
        .rload{
            position: absolute;
            bottom: .26rem;
            font-size: .26rem;
            height: .42rem;
            color: #888;
            line-height: .42rem;
            left: calc( 50% - .78rem);
        }
    }

    .idcardup1 {
        position: relative;
        text-align: center;
        background: #fff;
        float: right;
        width: 48.75% !important;
        height: 100.6% !important;
        .id-img { 
            width: 100% !important;
            height: 100.6% !important;
            margin: 0px auto;
            border-radius: .1rem;
        }
        .id-img2{
            position: absolute;
            width: .92rem;
            height: .92rem;
            bottom: 1rem;
            left: calc( 50% - .46rem);
        }
        .id-img3 { 
            width: 100% !important;
            height: 100.6% !important;
            margin: 0px auto;
            border-radius: .1rem;
            opacity:0.4;
            filter:alpha(opacity=40); /*  IE8 及其更早版本 */
            position: relative;
            border: 1px solid rgba(146, 139, 132, 0.721);
        }
        .rload{
            position: absolute;
            bottom: .26rem;
            font-size: .26rem;
            height: .42rem;
            color: #888;
            line-height: .42rem;
            left: calc( 50% - .78rem);
        }
    }
}
.a-upload {
    width: 100% !important;
    height: 100% !important;
    position: absolute;
    left: 0;
    cursor: pointer;
    color: #888;
    background: transparent;
    border-radius: 4px;
    overflow: hidden;
    display: inline-block;
    *display: inline;
    z-index: 9;
    *zoom: 1;
}

.a-upload input {
    position: absolute;
    left: 0px;
    top: 0;
    opacity: 0;
    width: 100% !important;
    height: 100% !important;
    filter: alpha(opacity=0);
    cursor: pointer
}


.a-upload1 {
    height: 100% !important;
    position: absolute;
    cursor: pointer;
    left: 0;
    color: #888;
    background: transparent;
    border-radius: 4px;
    overflow: hidden;
    display: inline-block;
    *display: inline;
    z-index: 9;
    *zoom: 1;
    width: 100%;
}

.a-upload1 input {
    position: absolute;
    left: 0px;
    top: 0;
    opacity: 0;
    width: 100% !important;
    height: 100% !important;
    filter: alpha(opacity=0);
    cursor: pointer
}

.a-upload:hover {
    color: #444;
    background: transparent;
    border-color: #ccc;
    text-decoration: none
}

vue:

data() {
                return {
                    ipshow:false,//切换input属性
                    formData:{
                        busLicenseImgUrl:"",//营业执照url
                        foodsLicenseImgUrl:"",//食品执照url
                    },

                    idylength:0,//营业执照长度
                    smflength:0,//食品执照长度
                }
            },
//上传营业执照
                upload(e){
                    let files = e.target.files || e.dataTransfer.files
                    var index = 0;//营业执照标识
                    if (!files.length) return
                    this.imgPreview(files[0],index)
                },

                //上传食品
                upload1(e){
                    let files = e.target.files || e.dataTransfer.files
                    var index = 1;//食品执照标识
                    if (!files.length) return
                    this.imgPreview(files[0],index)
                },
                
                imgPreview(file,index) {
                        let self = this
                        let Orientation
                        // 去获取拍照时的信息,解决拍出来的照片旋转问题
                        EXIF.getData(file, function () {
                            Orientation = EXIF.getTag(this, ‘Orientation‘)
                        })
                        // 看支持不支持FileReader
                        if (!file || !window.FileReader) return
                        if (/^image/.test(file.type)) {
                            var fileName = file.name;
                            // 创建一个reader
                            let reader = new FileReader();
                            // 将图片2将转成 base64 格式
                            reader.readAsDataURL(file);
                            // 读取成功后的回调
                            reader.onloadend = function () {
                                let result = this.result;
                                let img = new Image();
                                img.src = result;
                                //判断图片是否小于2M,是就直接上传,反之压缩图片
                                if (this.result.length <= (2048 * 1024)) {
                                    var headerImage = this.result;
                                    self.postImg(headerImage, fileName, file, index);
                                } else {
                                    img.onload = function () {
                                        let data = self.compress(img, Orientation);
                                        var headerImage = data;
                                        self.postImg(headerImage, fileName, file, index);
                                    }
                                }
                            }
                    }

                },
                postImg(headerImage, fileName, fil, index) {
                this.showjz = true;
                //压缩后的base64图片地址
                var imageBase64 = headerImage.substring(headerImage.indexOf(",") + 1)
                var mchNo = this.getQueryVariable(‘mchNo‘)
                let data = {
                    mchNo:mchNo,
                    imageBase64:imageBase64
                }
                if(index == 0){
                    //营业执照
                    axios({
                            method: ‘post‘,
                            url: "http://test.hpk.msxiaodai.com/apply/businessLicenseOCR",
                            data: data
                        })
                        .then(
                            response => {
                                var res = response.data
                                if (res.code == ‘0000‘) {
                                    this.idylength = 1;
                                    this.showjz = false;
                                    if(this.idylength == 1 && this.smflength == 1){
                                        this.showcontent = true;//显示数据信息
                                    }
                                    this.formData.busLicenseImgUrl = res.data.imageUrl
                                    this.formData.mchAddress = res.data.address
                                    this.formData.legal = res.data.legal
                                    this.formData.mchName = res.data.name
                                    this.formData.organCode = res.data.regNum
                                    this.formData.shopName = res.data.shopName
                                    this.formData.business = res.data.business
                                    this.formData.composingForm = res.data.composingForm
                                    this.formData.mainType = res.data.mainType
                                    this.formData.period = res.data.period

                                    vant.Toast.success(‘营业执照识别成功‘);
                                }else if(res.code == ‘1023‘){
                                    this.showerror = true
                                    this.errorval = res.msg
                                    this.showjz = false;
                                    this.showcontent = false;//显示数据信息
                                    this.idylength = 0;
                                    this.formData.busLicenseImgUrl = ""
                                    this.formData.mchAddress = ""
                                    this.formData.legal = ""
                                    this.formData.mchName = ""
                                    this.formData.organCode = ""
                                    this.formData.business = ""
                                    this.formData.composingForm = ""
                                    this.formData.mainType = ""
                                    this.formData.period = ""
                                } else {
                                    this.showerror = true
                                    this.errorval = ‘请上传真实有效的营业执照‘
                                    this.showjz = false;
                                    this.showcontent = false;//显示数据信息
                                    this.idylength = 0;
                                    this.formData.busLicenseImgUrl = ""
                                    this.formData.mchAddress = ""
                                    this.formData.legal = ""
                                    this.formData.mchName = ""
                                    this.formData.organCode = ""
                                    this.formData.business = ""
                                    this.formData.composingForm = ""
                                    this.formData.mainType = ""
                                    this.formData.period = ""
                                }
                            },
                            response => {
                                    this.showjz = false;
                                    this.idylength = 0;
                            }
                        )
                }else{
                    if(this.idylength !=0){
                    //食品执照
                    axios({
                            method: ‘post‘,
                            url: "http://test.hpk.msxiaodai.com/apply/foodLicenseOCR",
                            data: data
                        })
                        .then(
                            response => {
                                var res = response.data
                                if (res.code == ‘0000‘) {
                                    this.smflength = 1;
                                    //显示软键盘
                                    this.butsk()
                                    this.showjz = false;
                                    this.showcontent = true;//显示数据信息
                                    this.formData.foodsLicenseImgUrl = res.data.imageUrl
                                    
                                    vant.Toast.success(‘食品经营许可证识别成功‘);
                                }else if(res.code == ‘1023‘){
                                    this.showerror = true
                                    this.errorval = res.msg
                                    this.showcontent = false;//显示数据信息
                                    this.showjz = false;
                                    this.smflength = 0;
                                    this.formData.foodsLicenseImgUrl = ""
                                }  else {
                                    this.showerror = true
                                    this.errorval = ‘请上传真实有效的食品经营许可证‘
                                    this.showcontent = false;//显示数据信息
                                    this.showjz = false;
                                    this.smflength = 0;
                                    this.formData.foodsLicenseImgUrl = ""
                                }
                            },
                            response => {
                                    this.showjz = false;
                                    this.showerror = true
                                    this.errorval = ‘异常‘
                                    this.smflength = 0;
                            }
                        )
                        
                    }else{
                            this.showerror = true   
                            this.errorval = ‘请先上传真实有效的营业执照‘
                            this.showjz = false;
                    }
                }
                
            },

            // 压缩图片不得大于2M
            compress(img, Orientation) {
                let canvas = document.createElement("canvas");
                let ctx = canvas.getContext(‘2d‘);
                //瓦片canvas
                let tCanvas = document.createElement("canvas");
                let tctx = tCanvas.getContext("2d");
                let initSize = img.src.length;
                let width = img.width;
                let height = img.height;
                //如果图片大于6百万像素,计算压缩比并将大小压至600万以下
                let ratio;
                if ((ratio = width * height / 6000000) > 1) {
                    console.log("大于600万像素")
                    ratio = Math.sqrt(ratio);
                    width /= ratio;
                    height /= ratio;
                } else {
                    ratio = 1;
                }
                canvas.width = width;
                canvas.height = height;
                //        铺底色
                ctx.fillStyle = "#fff";
                ctx.fillRect(0, 0, canvas.width, canvas.height);
                //如果图片像素大于400万则使用瓦片绘制
                let count;
                if ((count = width * height / 4000000) > 1) {
                    console.log("大于400万像素");
                    count = ~~(Math.sqrt(count) + 1); //计算要分成多少块瓦片
                    //            计算每块瓦片的宽和高
                    let nw = ~~(width / count);
                    let nh = ~~(height / count);
                    tCanvas.width = nw;
                    tCanvas.height = nh;
                    for (let i = 0; i < count; i++) {
                        for (let j = 0; j < count; j++) {
                            tctx.drawImage(img, i * nw * ratio, j * nh * ratio, nw * ratio, nh * ratio, 0, 0,
                                nw, nh);
                            ctx.drawImage(tCanvas, i * nw, j * nh, nw, nh);
                        }
                    }
                } else {
                    ctx.drawImage(img, 0, 0, width, height);
                }
                //进行最小压缩
                let ndata = canvas.toDataURL(‘image/jpeg‘, 0.2);
                // console.log(‘压缩前:‘ + initSize);
                // console.log(‘压缩后:‘ + ndata.length);
                // console.log(‘压缩率:‘ + ~~(100 * (initSize - ndata.length) / initSize) + "%");
                tCanvas.width = tCanvas.height = canvas.width = canvas.height = 0;
                return ndata;
            },
    
            },

 

以上是关于H5 使用input标签上传图片给后台的主要内容,如果未能解决你的问题,请参考以下文章

H5调用本地相册/相机上传图片

input flie 拍照不能上传

后台管理系统之图片上传功能

H5拍照选择图片上传组件核心

H5 input file上传图片验证

H5图片预览压缩上传