vue前端实现批量上传图片功能并回显图片

 更新时间:2025年10月24日 09:02:57   作者:凉柚ˇ  
这篇文章主要为大家详细介绍了vue前端实现批量上传图片功能并回显图片的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

核心功能实现

在Vue组件的data函数中定义一个数组来存储选中的文件,并在methods中添加一个方法来处理文件选择事件。

methods: {
updateImgs(fieldname) {
      const inputFile = document.createElement('input')
      inputFile.type = 'file'
      inputFile.accept = 'image/*' // 只接受图片文件
      inputFile.multiple = true // 允许选择多个文件

      inputFile.click() // 触发文件选择对话框

      inputFile.onchange = async (e) => {
        const files = e.target.files // 获取所有选中的文件
        if (!files.length) return // 如果没有选中文件,直接返回

        // 遍历每个文件
        for (let i = 0; i < files.length; i++) {
          const file = files[i]
          const fileSizeMB = file.size / (1024 * 1024) // 转换为MB

          if (fileSizeMB > 2) {
            // 文件大小超过2MB,显示提示信息
            this.$message.error(`文件 ${file.name} 大小不能超过2MB`)
            continue // 跳过当前文件,继续检查下一个文件
          }

          // 使用 FormData 来构建上传的数据
          const formData = new FormData()
          formData.append('file', file)

          try {
            const { data: res } = await uploadFile(formData) // 你的配置后的上传图片接口
             //根据接口返回存图片的url 例this.xxx = res,之后应用到你的新增/编辑接口
             this.reportData.projimplement.imglist.push({
                  url: res.data.filePath,
                  description: file.name
                })
          } catch (error) {}
        }
      }
    },
    getFullImageUrl(relativePath) {
      // 结合服务器前缀和相对路径
      return `${this.serverPrefix}${relativePath}`
    },
    getPreviewList(imgList) {
    // 显示图片组
      return imgList.map((item) => this.getFullImageUrl(item.url))// 你的结构
    }
  }

实现了以下功能:

0.创建文件输入元素:使用document.createElement创建一个新的元素,类型设置为file,并且设置了accept属性来限制用户只能选择图片文件,同时设置了multiple属性允许用户选择多个文件。

1.触发文件选择对话框:通过调用inputFile.click()方法,模拟用户点击文件输入框,从而触发操作系统的文件选择对话框。

2.处理文件选择:通过监听inputFile元素的onchange事件,当用户选择了文件后,事件处理函数会被触发。

3.文件大小检查:在事件处理函数中,首先获取所有选中的文件,然后遍历这些文件,检查每个文件的大小是否超过2MB。如果文件大小超标,则显示错误提示并跳过该文件。

4.构建FormData:对于每个符合大小要求的文件,使用FormData对象来构建一个表单数据对象,并将文件附加到这个对象中。

5.异步上传文件:使用async/await语法,调用uploadFile函数(这个函数没有在代码中定义,可能是组件的另一个方法或者外部服务)来异步上传文件。uploadFile函数接收一个FormData对象作为参数,并返回一个包含上传结果的Promise。

6.处理上传结果:如果上传成功(res.success为true),则根据传入的fieldname参数,将文件路径添加到组件的相应数据属性中。之后显示成功消息。

7.错误处理:如果上传过程中出现错误,catch块会捕获异常,但当前的实现中并没有做任何错误处理,只是简单地忽略了错误。

HTML部分

<div style="position: relative">
            <el-button class="upimg_but" type="primary" size="small" @click="updateImgs"
              >上传</el-button
            >
            <div class="img-block">
              <div class="img-box" v-for="(item, index) in reportData.projimplement.imglist" :key="index">
                <el-tooltip effect="dark" :content="item.description" placement="bottom">
                  <el-image
                    style="width: 150px; height: 150px"
                    :src="getFullImageUrl(item.url)"
                    fit="contain"
                    lazy
                    :preview-src-list="getPreviewList(reportData.projimplement.imglist)"
                  ></el-image>
                </el-tooltip>
                <i class="el-icon-delete" style="cursor: pointer" @click="deleteImg(index)"></i>
              </div>
            </div>
          </div>

CSS部分

.img-block {
  padding-top: 30px;
  max-height: 320px;
  display: flex;
  flex-wrap: wrap;
  overflow-y: auto;

  &::-webkit-scrollbar-track-piece {
    background: #e4e4e4;
  }

  &::-webkit-scrollbar {
    width: 4px;
    height: 8px;
  }

  &::-webkit-scrollbar-thumb {
    background: #c2c2c2;
    border-radius: 20px;
  }

  .img-box {
    width: 33%;
    text-align: center;
    margin: 8px 0;
  }
}

效果预览

ps:请注意,上述代码只是一个示例,实际应用中你可能需要根据具体需求调整样式、上传逻辑和错误处理等。此外,确保后端API能够正确处理批量上传的文件。

相关文章

  • vue中使用scrollTo没有效果的完美解决方法

    vue中使用scrollTo没有效果的完美解决方法

    这篇文章主要介绍了在vue中使用scrollTo没有效果的解决方法,本文给大家分享具体操作步骤,在这里需要注意scrollTo要作用在可滚动的元素上,不然不生效,scrollTop就会一直为0,需要的朋友可以参考下
    2023-10-10
  • vue3如何将通用组件注册成全局组件

    vue3如何将通用组件注册成全局组件

    这篇文章主要介绍了vue3将通用组件注册成全局组件的方法,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • Vue中computed和watch有哪些区别

    Vue中computed和watch有哪些区别

    这篇文章主要介绍了Vue中computed和watch有哪些区别,帮助大家更好的理解和使用vue框架,感兴趣的朋友可以了解下
    2020-12-12
  • vue响应式系统之observe、watcher、dep的源码解析

    vue响应式系统之observe、watcher、dep的源码解析

    这篇文章主要介绍了vue响应式系统之observe、watcher、dep的源码解析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-04-04
  • Vue+penlayers实现多边形绘制及展示

    Vue+penlayers实现多边形绘制及展示

    这篇文章主要为大家详细介绍了Vue+penlayers实现多边形绘制及展示,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • Vue如何实现验证码输入交互

    Vue如何实现验证码输入交互

    这篇文章主要介绍了Vue实现验证码输入交互的示例,帮助大家更好的理解和使用vue,感兴趣的朋友可以了解下
    2020-12-12
  • vue3+vite使用element-plus问题

    vue3+vite使用element-plus问题

    这篇文章主要介绍了vue3+vite使用element-plus问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • Vue+Java+Base64实现条码解析的示例

    Vue+Java+Base64实现条码解析的示例

    这篇文章主要介绍了Vue+Java+Base64实现条码解析的示例,帮助大家实现条码解析,感兴趣的朋友可以了解下
    2020-09-09
  • Vue3实现地图选点组件的示例代码

    Vue3实现地图选点组件的示例代码

    这篇文章主要为大家详细介绍了Vue3实现地图选点组件的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01
  • vue-admin如何实现动态路由

    vue-admin如何实现动态路由

    这篇文章主要介绍了vue-admin如何实现动态路由问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07

最新评论