返回顶部

vue——quill-editor自定义图片上传

参考:https://www.cnblogs.com/shuihanxiao/p/11081035.html

      https://www.jianshu.com/p/9e4e4d955d0f

     https://www.cnblogs.com/look-up-at-the-starlit-sky/p/12048001.html

 

我的情况

vue项目中使用quill-editor,上传图片过大后,因为quill-editor中的图片上传是将图片转为base64格式的,保存时传给服务器的就字符长度就会过长,所以想针对图片单独上传至后端。

 

vue

<template>
    <div class="bg-box">
        <quill-editor
                v-model="content"
                ref="myQuillEditor"
                class="editer"
                :options="editorOption"
        ></quill-editor>
    </div>
</template>

<script>
    import API from "../../../api/index.js";//请求基础路径
    import {quillEditor} from "vue-quill-editor"; //调用编辑器
    import "quill/dist/quill.core.css";
    import "quill/dist/quill.snow.css";
    import "quill/dist/quill.bubble.css";
    import axios from "axios";

    //富文本框文件上传配置
    const uploadConfig = {
        action: '',  // 必填参数 图片上传地址
        methods: '',  // 必填参数 图片上传方式
        token: '',  // 可选参数 如果需要token验证,假设你的token有存放在sessionStorage
        name: 'img',  // 必填参数 文件的参数名
        size: 500,  // 可选参数   图片大小,单位为Kb, 1M = 1024Kb
        accept: 'image/png, image/gif, image/jpeg, image/bmp, image/x-icon'  // 可选 可上传的图片格式
    };
    // 工具栏配置
    const toolbarOptions = [
        ['bold', 'italic', 'underline', 'strike'],        // toggled buttons
        ['blockquote', 'code-block'],

        [{'header': 1}, {'header': 2}],               // custom button values
        [{'list': 'ordered'}, {'list': 'bullet'}],
        [{'script': 'sub'}, {'script': 'super'}],      // superscript/subscript
        [{'indent': '-1'}, {'indent': '+1'}],          // outdent/indent
        [{'direction': 'rtl'}],                         // text direction

        [{'size': ['small', false, 'large', 'huge']}],  // custom dropdown
        [{'header': [1, 2, 3, 4, 5, 6, false]}],

        [{'color': []}, {'background': []}],          // dropdown with defaults from theme
        [{'font': []}],
        [{'align': []}],
        ['clean'],                                      // remove formatting button
        ['link', 'image', 'video'],
    ];

    const handlers = {
        //重写图片上传
        image: function image() {
            let self = this;

            let fileInput = this.container.querySelector('input.ql-image[type=file]');
            if (fileInput === null) {
                fileInput = document.createElement('input');
                fileInput.setAttribute('type', 'file');
                // 设置图片参数名
                if (uploadConfig.name) {
                    fileInput.setAttribute('name', uploadConfig.name);
                }
                // 可设置上传图片的格式
                fileInput.setAttribute('accept', uploadConfig.accept);
                fileInput.classList.add('ql-image');
                // 监听选择文件
                fileInput.addEventListener('change', function () {
                    let params = new FormData();
                    params.append('file', fileInput.files[0]);
                    axios.post(API.imgUpLoad, params, {
                        headers: {
                            'Content-Type': 'multipart/form-data',
                            'token': sessionStorage.getItem('token')
                        }
                    }).then(function (res) {
                        if (res.status === 200) {
                            let length = self.quill.getSelection(true).index;
                            //写入图片
                            self.quill.insertEmbed(length, 'image', res.data.path);
                            self.quill.setSelection(length + 1)
                        } else {
                            self.$message.error(res.data.message);
                        }
                        fileInput.value = ''
                    })
                });
                this.container.appendChild(fileInput);
            }
            fileInput.click();
        }
    };

    export default {
        components: {
            quillEditor
        },
        data() {
            return {
                content: "", //富文本输入内容
                editorOption: {
                    modules: {
                        toolbar: {
                            container: toolbarOptions,  // 工具栏
                            handlers: handlers,
                        }
                    }
                },
            };
        },
    };
</script>

<style lang="scss" scoped>
    .editer {
        width: 100%;
        margin-top: 24px;
    }

    .bg-box /deep/ .ql-toolbar.ql-snow {
        background-color: #f4f4f4;
    }

    .bg-box /deep/ .ql-container.ql-snow {
        height: 500px;
        background-color: white;
    }
</style>

 

注意

当图片过大,使用v-html写入页面时,图片可能会超出页面。我用css修改无效,用js的replace方法,把后端返回的字符串中的 <img 替换为 <img style="max-width:100%;" 即可

 

1. 替换第一个:

 
let str = 'abcadeacf';
let str1 = str.replace('a', 'o');
console.log(str1);   //obcadeacf
 

 

2. 替换所有:

let str = 'abcadeacf';
let str2 = str.replace(/a/g, 'o');//g是重点,如果替换的为‘/’,需要转义,吧/a/g替换为'/\//g'
console.log(str2);  // obcodeocf

 

posted @ 2020-09-02 14:21  前端-xyq  阅读(1337)  评论(0编辑  收藏  举报