• el-upload实现复制粘贴图片


    前言:

    在之前的项目中,利用`el-upload`实现了上传图片视频的预览。项目上线后,经使用人员反馈,上传图片、视频每次要先保存到本地然后再上传,很是浪费时间,公司客服人员时间又很紧迫(因为要响应下一位客户的咨询),所以想直接复制图片到表单中,实现自动上传。OK,需求就是这么来得,下面是实现过程。

    要上传图片,肯定要先拿到图片的信息,比如图片url、base64、大小、名称等等。那复制时怎么拿图片信息呢?

    本文中使用了富文本编辑器来实现图片的复制粘贴功能,我们也可以通过监听鼠标的复制粘贴事件来实现。

    使用的富文本编辑器:快速开始 | wangEditor

    1、安装富文本编辑器

    1. npm install @wangeditor/editor --save
    2. npm install @wangeditor/editor-for-vue --save

    2、引入组件

    import { Editor, Toolbar } from '@wangeditor/editor-for-vue'

    3、使用组件

    视图:

    1. <el-form-item label="上传图片" class="myUpload">
    2. <div slot="label" style="display:block;">
    3. 上传图片
    4. <span style="color:#999999;">(最多10张,单张不能超过10M)span>
    5. div>
    6. <div style="margin:1px 0 10px;border: 1px solid #ccc;display:inline-block;">
    7. /*引用组件*/
    8. <Toolbar
    9. :editor="editor"
    10. :default-config="toolbarConfig"
    11. :mode="mode"
    12. style="visibility: hidden;height:0; border-bottom: 1px solid #ccc"
    13. />
    14. /*引用组件*/
    15. <Editor
    16. id="wangEditor"
    17. v-model="html"
    18. :default-config="editorConfig"
    19. :mode="mode"
    20. style="height: 45px; overflow-y: hidden;"
    21. @onCreated="onCreated"
    22. />
    23. div>
    24. <el-upload
    25. :auto-upload="false"
    26. :limit="10"
    27. :file-list="imageList"
    28. action="#"
    29. disabled
    30. accept=".jpg,.jpeg,.png,.mp4"
    31. list-type="picture-card"
    32. >
    33. <i slot="default" class="el-icon-plus">i>
    34. <div slot="file" slot-scope="{ file }">
    35. <img :src="file.url" class="el-upload-list__item-thumbnail" alt="" />
    36. <div class="el-upload-list__item-actions">
    37. <span class="el-upload-list__item-preview" @click="handlePictureCardPreview(file)">
    38. <i class="el-icon-zoom-in">i>
    39. span>
    40. <span class="el-upload-list__item-delete" @click="handleRemoveImg(file)">
    41. <i class="el-icon-delete">i>
    42. span>
    43. div>
    44. div>
    45. el-upload>
    46. el-form-item>

    1、根据自己需要添加样式

    2、`style="visibility: hidden;height:0; border-bottom: 1px solid #ccc"`隐藏富文本工具栏,我们只是复制图片,用不到工具栏

     JS:

    1. created() {
    2. const that = this
    3. const api = process.env.NODE_ENV === 'production' ? 'https://生产' : 'http://测试'
    4. // 配置图片上传,要在此处配置,编辑器创建以后,再赋值就不起作用了
    5. this.editorConfig.MENU_CONF['uploadImage'] = {
    6. server: api + '/summary/upload',
    7. // form-data fieldName ,默认值 'wangeditor-uploaded-image'
    8. fieldName: 'file',
    9. // 单个文件的最大体积限制,默认为 2M
    10. maxFileSize: 10 * 1024 * 1024,
    11. // 最多可上传几个文件,默认为 100
    12. maxNumberOfFiles: 10,
    13. // 选择文件时的类型限制,默认为 ['image/*'] 。如不想限制,则设置为 []
    14. allowedFileTypes: ['image/*'],
    15. // 小于该值就插入 base64 格式(而不上传),默认为 0
    16. base64LimitSize: 10 * 1024 * 1024,
    17. // 自定义增加 http header
    18. headers: {
    19. 'Admin-Token': Lockr.get('Admin-Token')
    20. },
    21. // 超时时间,默认为 10 秒
    22. timeout: 60 * 1000,
    23. // 上传之前处触发
    24. onBeforeUpload(file) {
    25. const fileObj = Object.values(file)[0].data
    26. console.log('fileObj:', fileObj)
    27. const isJPG = fileObj.type == 'image/jpg' || fileObj.type == 'image/jpeg' || fileObj.type == 'image/png'
    28. if (!isJPG) {
    29. that.$message.error('图片只能是 JPG、GIF、PNG 格式!')
    30. return false
    31. }
    32. },
    33. // 文件上传失败
    34. onFailed(file, res) {
    35. console.log(`${file.name} 上传失败`, res)
    36. },
    37. // 文件上传成功之后
    38. onSuccess(file, res) {
    39. console.log(`${file.name} 上传成功`, res)
    40. }
    41. // 上传成功自动插入
    42. // customInsert(res, insertFn) {
    43. // console.log('res:', res)
    44. // 从 res 中找到 url ,然后插入图片
    45. // insertFn(res.url)
    46. // }
    47. }
    48. // 插入图片后执行(base64格式会自动插入)
    49. this.editorConfig.MENU_CONF['insertImage'] = {
    50. onInsertedImage(imageNode) {
    51. console.log('node:', imageNode)
    52. if (imageNode == null) return
    53. const { alt, src } = imageNode
    54. const obj = {
    55. name: alt,
    56. fileBase64: src,
    57. url: src
    58. }
    59. that.imageList.push(obj)
    60. if (that.imageList.length > 10) {
    61. that.imageList = that.imageList.splice(0, 10)
    62. }
    63. that.editor.setHtml('
      '
      )
    64. }
    65. }
    66. this.editorConfig.hoverbarKeys = {
    67. image: {
    68. // 配置 image 元素的 hoverbar
    69. menuKeys: ['imageWidth30', 'imageWidth100', 'deleteImage']
    70. }
    71. }
    72. },
    73. methods:{
    74. // 初始化编辑器
    75. onCreated(editor) {
    76. console.log('初始化编辑器')
    77. this.editor = Object.seal(editor)
    78. if (this.editor && !this.detail) {
    79. // this.editor.setHtml('
      ')
    80. }
    81. },
    82. // 移除图片文件
    83. handleRemoveImg(file) {
    84. this.imageList.map((item, index) => {
    85. if (item.name === file.name) {
    86. // 全量编辑表单时
    87. if (item.type === 2) {
    88. item.type = 1 // 2 保留 1 删除
    89. this.newImgList = this.imageList.splice(index, 1)
    90. } else {
    91. // 新增图片时
    92. this.imageList.splice(index, 1)
    93. }
    94. }
    95. })
    96. },
    97. // 预览图片
    98. handlePictureCardPreview(file) {
    99. this.dialogImageUrl = file.url
    100. this.$alert(`${this.dialogImageUrl}" width="100%">`, {
    101. dangerouslyUseHTMLString: true,
    102. callback: () => {}
    103. })
    104. },
    105. }

    1、初始化富文本编辑器

    2、默认配置一定要写在`created()`生命周期里,否则初始化时会检测不到

    3、上面代码中虽然配置了上传图片API,但是没有用到,因为图片默认使用了`base64格式`而不上传

    4、因为没有使用图片上传,所以上传相关的事件没有触发

    5、使用`base64`格式插入图片后,会触发`onInsertedImage`事件

    6、默认配置时可以设置一个空`div`,解决样式问题

    ​​​​​​详情参考:菜单配置 | wangEditor开源 Web 富文本编辑器,开箱即用,配置简单icon-default.png?t=N7T8https://www.wangeditor.com/v5/menu-config.html#%E5%9B%BE%E7%89%87

     

  • 相关阅读:
    C# 中什么是重写(子类改写父类方法)
    Leetcode 19. 删除链表的倒数第N个节点
    C++11中篇
    我的用户留言案例哪位懂的能帮我看一下
    RabbitMQ无法删除unsynchronized队列及解决办法
    springCloud学习-nacos配置管理-配置与拉取、配置热更新、多环境配置、多服务配置共享
    简易搜索引擎SEWeibo
    超全selenium元素定位XPath、CSS
    Day36力扣打卡
    Magisk V26.3卡刷包APK最新版下载-支持payload.bin自动维补ROOT
  • 原文地址:https://blog.csdn.net/chenlim87/article/details/133274729