快速创建VUE移动端上传图片功能

主要功能:限制图片张数、图片大小压缩、同时上传多张、上传后可编辑删除、上传中和上传失败状态显示。

使用配置:使用vantUI、axios请求经过封装、安装image-compressor.js图片压缩

步骤:

  1. 安装image-compressor.js

npm install image-compressor.js //注意是image-compressor.js不是image-compressor

  1. 创建一个VUE组件,文件名可以为updatefile

<template>

    <div class="updatefile">

        <div class="fileCon">

            <div class="list">

                <div v-for="(item,index) in list" :key="index">

                    <img class="close" src="../assets/delete.png" @click="close(index)">

                    <img :src="item" />

                </div>

                <div class="add" v-show="maxStatus" @click="chooseType">

                    <img class="add-image" src="../assets/add.png">

                </div>

            </div>

        </div>

        <input id="upload_file" type="file" class="file-input" accept="image/png,image/jpeg,image/jpg" :multiple="multiple" @change="inputChange" style="display: none" />

    </div>

</template>

<script>

    import { Toast } from 'vant'

    import ImageCompressor from 'image-compressor.js'

    import checkImgFileSize from '@/utils/checkImgFileSize.js'

    export default {

        name: 'updatefile',

        data() {

            return {

                maxStatus: true,

            }

        },

        props: {

            //是否支持多选

            multiple: {

                type: Boolean,

                default: true,

            },

            //最多上传几张

            max: {

                type: Number,

                default: 3,

            },

            //编辑反显使用

            list: {

                type: Array,

                default() {

                    return []

                },

            },

        },

        created() {

            this.maxStatus = this.list.length !== this.max

        },

        methods: {

            chooseType() {

                document.getElementById('upload_file').click()

            },

            close(index) {

                this.list.splice(index, 1)

                this.maxStatus = this.list.length !== this.max

            },

            async inputChange(e) {

                let files = e.target.files

                let len = this.list.length + files.length

                if (len > this.max) {

                    document.getElementById('upload_file').value = ''

                    Toast(`最多允许上传${this.max}张`)

                    return

                }

                let uploadAll = [].slice.call(files, 0).map(this.upload)

                // 使用object.values(files),测试安卓存在兼容性问题,替换为[].slice.call(files ,0)

                Toast.loading({

                    // 上传中效果,可自行替换。

                    text: '上传中...',

                    spinnerType: 'fading-circle',

                })

                let result = await Promise.all(uploadAll)

                console.log('result:' + result)

                document.getElementById('upload_file').value = ''

                Toast.clear()

            },

            upload(file) {

                // console.log('file1: ', file)

                return new Promise(async resolve => {

                    if (checkImgFileSize(file)) {

                        const that = this

                        const imageCompressor = new ImageCompressor(file, {

                            // 图片压缩的质量,可改

                            quality: 0.2,

                            success(fileRes) {

                                that.uploadFile(fileRes, resolve)

                            },

                        })

                        console.log(imageCompressor)

                    } else {

                        this.uploadFile(file, resolve)

                    }

                })

            },

            // 调用接口上传图片

            uploadFile(file, resolve) {

                // console.log('file2: ', file)

                let form = new FormData()

                form.append('uploadFileName', file)

                // form.append('***') //根据上传入参添加参数

                this.$instance

                    .post('v1/admin/upload/file', form)

                    .then(result => {

                        if (result.data.data !== undefined) {

                            if (result.data.code !== 0) {

                                // 失败处理

                                Toast(`图片上传失败`)

                                resolve(result)

                                // return

                            } else {

                                this.list.push(result.data.data)

                                // console.log('this.list: ', this.list)

                                if (this.list.length === this.max) {

                                    this.maxStatus = false

                                }

                                resolve(result)

                            }

                        } else {

                            // 失败处理

                            Toast(`图片上传失败`)

                        }

                    })

                    .catch(error => {

                        Toast(`图片上传失败`)

                        console.log('error: ', error)

                    })

            },

        },

    }

</script>

<style lang="scss" scoped>

    .updatefile {

        .fileCon {

            width: 100%;

            min-height: 76px;

            display: flex;

            flex-direction: row;

            justify-content: flex-start;

            align-items: center;

            .list {

                width: 100%;

                min-height: 76px;

                display: flex;

                flex-wrap: wrap;

                align-items: center;

                & > div {

                    width: 54px;

                    height: 54px;

                    margin: 10px 10px 10px 0;

                    position: relative;

                    background: #ccc;

                    & > img {

                        width: 100%;

                        height: 100%;

                    }

                    .close {

                        width: 15px;

                        height: 15px;

                        background-color: #fff;

                        border-radius: 50%;

                        background-image: url(../assets/delete.png);

                        background-size: 100%;

                        position: absolute;

                        top: -4px;

                        right: -4px;

                    }

                }

            }

        }

        .add {

            width: 54px;

            height: 54px;

            background-color: #ccc;

            .add-image {

                width: 20px !important;

                height: 20px !important;

                position: relative;

                top: 15px;

                left: 50%;

                transform: translate(-50%);

            }

        }

    }

</style>

ps:从父级页面传入相应的值到props里面

  1. 引入checkImgFileSize.js,该文件表示图片超过1M就进行压缩

export default (file, maxSize = 1) => {

    // 转为 M

    const size = file.size

    return size >= maxSize * 1024 * 1024

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352