vue.js用weui写的图片上传

原理:前端传给自己服务器,自己服务器发到七牛云服务器,再返回给自己服务器,再返回给前端 

<template>

  <div>
        <div class="weui-gallery" v-bind:class="{showgallery: showgallery}">
            <span class="weui-gallery__img"  @click="closeGallery" :style="{backgroundImage:'url('+galleryimgUrl+')'}"></span>
            <div class="weui-gallery__opr">
                <a href="javascript:" class="weui-gallery__del" @click="delGallery">
                    <i class="weui-icon-delete weui-icon_gallery-delete"></i>
                </a>
            </div>
        </div>

        <div class="weui-cell">
            <div class="weui-uploader">
                <div class="weui-uploader__hd">
                    <p class="weui-uploader__title">图片上传</p>
                    <div class="weui-uploader__info">{{uploadNum}}/{{allUploadNum}}</div>
                </div>
                <div class="weui-uploader__bd">
                    <ul class="weui-uploader__files" id="uploaderFiles">

                        <li
                            v-for="(item,index) in imgList"
                            :key ="index"
                            :style="{backgroundImage:'url('+item.imgUrl+')'}"
                            @click="openGallery(index)"
                            class="weui-uploader__file weui-uploader__file_status"
                         >
                             <div class="weui-uploader__file-content">
                                <i :class="[item.flag == 1 ? 'weui-icon-success' : 'weui-icon-warn']"></i>
                            </div>
                         </li>
                        
                    </ul>
                    <div class="weui-uploader__input-box" v-show="showUploadBtn">
                        <input id="uploaderInput" class="weui-uploader__input" v-on:change="fileChange" type="file" accept="image/*" multiple="">
                    </div>
                </div>
            </div>
        </div>
        
  </div>

</template>

<script>
import axios from 'axios'
export default {
    name: "TestContent",
    data (){
        return {
            //所有图片列表
            imgList: [
                // { imgUrl: 'http://api.99314.com/static/images/pic_160.png', flag: 1},
                // { imgUrl: 'http://hfyd.yihuizhuang.com/uploads/allimg/180925/1-1P925160340.jpg', flag: 0},
                // { imgUrl: 'http://hfyd.yihuizhuang.com/uploads/allimg/180925/1-1P925160340-50.jpg', flag: 1}
            ],
            //是否显示 gallery
            showgallery: false,
            //gallery当前的图片地址
            galleryimgUrl: '',
            //当前点击的图片地址索引
            currentImgIndex: -1,
            //一共可以上传多少张图片
            allUploadNum: 5,
            //已经上传的图片数量
            uploadNum: 0,
            //是否显示上传按钮,当大于最大上传数量的时候,隐藏,否则显示
            showUploadBtn: true
        }
    },
    watch : {
        imgList: function(){
            this.uploadNum = this.imgList.length
            if(this.imgList.length > this.allUploadNum){
                this.imgList = this.imgList.slice(0, this.allUploadNum)
                this.$weui.toast('只能添加'+ this.allUploadNum +'张图片')
                
            }
            //当图片达到允许最大上传值 等于大于的时候,则隐藏
            if(this.imgList.length >= this.allUploadNum){
                this.showUploadBtn = false
            }else{
                this.showUploadBtn = true
            }
        }
    },
    methods: {
        // 添加了图片之后触发的事件
        fileChange (res){
            // console.log(res.target.files[0].name)
            // 拿到 files(数组),然后提交到后端,完成之后,把新的图片加到 imgList中去
            
            //如果获取的文件数组长度小于1,说明没有获取到,直接结束
            // 遍历数据 res.target.files, 然后挨个去上传
            const files = res.target.files

            // 这里要注意,如果选择的图片加上已经存在的图片数量大于最大上传的数量,只能上传最大数量,然后提示打到达最大的数量
            let nowUploadNum = files.length + this.imgList.length

            if(nowUploadNum > this.allUploadNum){
                // 如果已经存在的数量加上上传的数量大于 最大上传数量, 则上传 最大上传数量 - 实际存在的数量
                let trueUplaodNum = this.allUploadNum - this.imgList.length
                if(trueUplaodNum > 0){
                    
                    // 如果实际上传数量大于0, 说明还需上传
                    this.uploadQiniu(trueUplaodNum, files, 1)

                }else{
                    // 如果实际上传数量 不大于 0, 说明已经是最大上传数量,不上传,直接提示 已经是最大数量
                    this.$weui.alert('最大只能上传' + this.allUploadNum + '张')
                }
            }else{

                //如果现在要上传的数量加上一句存在的图片数量 小于 最大上传数量,则直接上传
                this.uploadQiniu(files.length, files, 0)
            }
             
            
            
        },

        //如果 callback=1,表示有一句提醒
        uploadQiniu (uploadNum, files, callback){
            //如果文件长度小于1,表示没有文件,则不上传
            if(files.length < 1){
                return
            }
            // 加载层
            var loading = this.$weui.loading('上传中..')

            for (let i = 0; i < uploadNum; i++) {
                //保存图片
                let formData = new FormData()
                formData.append('img', files[i])

                //将图片提交到后台中
                const that = this
                axios.post(this.common.HTTPHOST+"/api/qiniu/add", formData, {
                    headers: {'Content-Type': 'application/x-www-form-urlencoded'}
                }).then(function(res){
                    let retData = res.data
                    if(retData.ret == 1){
                        //上传成功
                        that.imgList.push({imgUrl: retData.data.thumb_url, flag: 1})
                    }else{
                        //上传失败, 将本地的图片显示在图片预览中
                        let src, url = window.URL || window.webkitURL || window.mozURL
                        if (url) {
                            src = url.createObjectURL(files[i])
                        }
                        that.imgList.push({imgUrl: src, flag: 1})
                    }

                    //如果callback = 1 表示结束之后还有一句提醒
                    if(callback == 1){
                        that.$weui.alert('最大只能上传' + that.allUploadNum + '张')
                    }

                    setTimeout(function(){
                        loading.hide()
                    },1200)

                }).catch(function(err){
                    console.log(err)
                })
            }
        },

        //打开 gallery
        openGallery (index){
            this.currentImgIndex = index
            this.galleryimgUrl = this.imgList[index]['imgUrl']
            this.showgallery = true
        },

        //删除gallery
        delGallery (){
            const that = this
            if(this.currentImgIndex > -1){
                //如果当前索引大于0,说明存在
                this.imgList.splice(this.currentImgIndex, 1)
                this.currentImgIndex = -1
            }
            that.$weui.toast('操作成功', {
                duration: 1000,
                callback: function(){
                    that.showgallery = false
                }
            });
        },

        //关闭gllery
        closeGallery (){
            this.showgallery = false
        }
    },
    mounted (){

    }
}

</script>

<style lang="stylus" scoped>
.showgallery
    display: block
>>>.weui-uploader__file_status:before
    background: none
>>>.weui-uploader__file-content
    top: 15px
    left: 80%
</style>

 

发布了88 篇原创文章 · 获赞 6 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/codipy/article/details/103237371