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能够正确处理批量上传的文件。

相关文章

  • ElementPlus 自定义封装 el-date-picker 的快捷功能示例详解

    ElementPlus 自定义封装 el-date-picker 的快捷功能示例详解

    文章讨论了用户对官网提供的案例不满足快捷功能需求的情况,建议在外部自定义组件中导入并使用快捷内容,以满足用户需求,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2024-12-12
  • Vue实现剪切板图片压缩功能

    Vue实现剪切板图片压缩功能

    这篇文章主要介绍了Vue实现剪切板图片压缩功能,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • vue中window.addEventListener(‘scroll‘, xx)失效的解决

    vue中window.addEventListener(‘scroll‘, xx)失效的解决

    这篇文章主要介绍了vue中window.addEventListener(‘scroll‘, xx)失效的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • vue项目中如何排查没有使用的变量、js、css和无关文件引用等

    vue项目中如何排查没有使用的变量、js、css和无关文件引用等

    这篇文章主要介绍了vue项目中如何排查没有使用的变量、js、css和无关文件引用等的相关资料,通过示例讲解了ESLint配置、Webpack插件使用和手动检查,以优化代码结构和资源管理,需要的朋友可以参考下
    2025-06-06
  • 使用echarts柱状图实现select下拉刷新数据

    使用echarts柱状图实现select下拉刷新数据

    这篇文章主要介绍了使用echarts柱状图实现select下拉刷新数据,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • Vue页面跳转动画效果的实现方法

    Vue页面跳转动画效果的实现方法

    百度了好久都没办法实现vue中一个页面跳到另一个页面,甚至到google上搜索也是没办法的,最终还是找了高人亲自指导,所以下面这篇文章主要给大家介绍了关于Vue页面跳转动画效果的实现方法,需要的朋友可以参考下
    2018-09-09
  • 关于Vue的路由权限管理的示例代码

    关于Vue的路由权限管理的示例代码

    本篇文章主要介绍了关于Vue的路由权限管理的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • Vue实现导出Excel表格文件提示“文件已损坏无法打开”的解决方法

    Vue实现导出Excel表格文件提示“文件已损坏无法打开”的解决方法

    xlsx用于读取解析和写入Excel文件的JavaScript库,它提供了一系列的API处理Excel文件,使用该库,可以将数据转换Excel文件并下载到本地,适用于在前端直接生成Excel文件,这篇文章主要介绍了Vue实现导出Excel表格,提示文件已损坏,无法打开的解决方法,需要的朋友可以参考下
    2024-01-01
  • vue移动端城市三级联动组件使用详解

    vue移动端城市三级联动组件使用详解

    这篇文章主要为大家详细介绍了vue移动端城市三级联动组件的使用,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • vue3中toRef、toRefs和toRaw的使用

    vue3中toRef、toRefs和toRaw的使用

    本文主要介绍了vue3中toRef、toRefs和toRaw的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-05-05

最新评论