vue el-upload上传文件

效果图:
在这里插入图片描述
方式一: 提交按钮时才上传文件

/**
 * 封装图片上传方法
 * @param url
 * @param data
 * @returns {Promise}
 */
export function uploadImg(url, data) {
  return request({
    url: url,
    data: data,
    headers: {
      'Content-Type':
        'multipart/form-data',
    },
    method: 'post',
  })
}
import { uploadImg } from '@/utils/https.js'

export function uploadImgs(data) {
  return uploadImg('/common/uploadFile',data)
}

import { uploadImgs } from '@/api/sysConfig'
<div style="display:flex;justify-content: center;position: relative;left:-40px;top:-35px">
        <el-form label-width="120px">
          <el-form-item label="网站LOGO:" prop="LogoImg">
            <el-upload
              drag
              :limit="1"
              action="https://jsonplaceholder.typicode.com/posts/"
              list-type="picture"
              :http-request="modeUpload"
              :file-list="fileList"
              :on-remove="handleRemove"
            >
              <img v-if="currentImgUrl" :src="currentImgUrl" class="avatar">
              <i v-else class="el-icon-upload"></i>
              <div class="el-upload__text">
                将文件拖到此处,或
                <em>点击上传</em>
              </div>
              <div
                slot="tip"
                class="el-upload__tip"
              >只能上传jpg/png文件,且不超过{{ 200 }}kb</div>
            </el-upload>
          </el-form-item>
        </el-form>
      </div>
      <div style="display: flex;justify-content:center;align-items:center">
        <div style="padding-bottom:15px;">
          <el-button size="medium" type="success" @click="handleSubmit">提交</el-button>
        </div>
      </div>
  data() {
    return {
      // currentImgUrl: 'https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg',
      currentImgUrl: '', // 当前Logo图片地址
      fileItem: {}, // 正在上传的图片
      fileList: [], // 上传图片的文件列表
    }
methods: {
    handleRemove(file, fileList) {
      console.log('移除文件触发:', file, fileList)
    },
    modeUpload(item) {
      this.fileItem = item.file // 获取要上传的文件
    },
        // “提交”按钮 提交表单事件
    handleSubmit() {
      const isSearch = this.$refs.editFormRef.checkFrom() // 检测表单必填的是否都填了
      // 如果都填写了
      if (isSearch) {
        console.log('图片数据:', this.fileItem)
        const fd = new FormData()
        fd.append('file', this.fileItem) // file为与后端约定的数据的key
        let token= 'aaaaaaaaaaaaa'
        fd.append('Authorization', token) // 我的接口需要这个token参数,根据实际接口需要进行参数调整
        uploadImgs(fd).then((response) => {
          console.log('接口返回:', response.data)
          if (response.data.code === 200) {
            alert('上传成功', 'warning')
          } else {
            // 上传失败
          }
        })
      }
    },

方式二: 上传文件时直接传接口
去掉提交按钮,改一下modeUpload函数:

modeUpload(item) {
      this.fileItem = item.file // 获取要上传的文件
      const fd = new FormData()
        fd.append('file', this.fileItem) // file为与后端约定的数据的key
        fd.append('Authorization', token) // 我的接口需要这个token参数,根据实际接口需要进行参数调整
        uploadImgs(fd).then((response) => {
          console.log('接口返回:', response.data)
          if (response.data.code === 200) {
            alert('上传成功', 'warning')
          } else {
            // 上传失败
          }
        })
    },
### Vue `el-upload` 组件实现文件上传 #### 基本配置与属性设置 为了在项目使用 `el-upload` 实现文件上传功能,需先引入 Element Plus 库并注册 `el-upload` 组件。此组件支持多种自定义选项来满足不同场景下的需求。 对于基本用法而言,可以通过指定 `action` 属性指向服务器端接收上传请求的URL地址[^1]: ```html <template> <div> <!-- action 表示提交的目标 URL --> <el-upload :action="uploadUrl"> <button type="button">点击上传</button> </el-upload> </div> </template> <script setup> import { ref } from 'vue'; const uploadUrl = ref('https://jsonplaceholder.typicode.com/posts/'); </script> ``` #### 处理文件列表变化 当选择了要上传的文件时,`fileList` 参数可以用来跟踪当前已选的文件状态。每当有新文件被加入或移除时,这个参数都会自动更新以反映最新的情况。 ```html <template> <div> <el-upload :action="uploadUrl" :on-change="handleChange" :file-list="fileList" > <button type="button">选择文件</button> </el-upload> <ul v-if="fileList.length > 0"> <li v-for="(item, index) in fileList" :key="index">{{ item.name }}</li> </ul> </div> </template> <script setup> import { ref } from 'vue'; const uploadUrl = ref('https://jsonplaceholder.typicode.com/posts/'); const fileList = ref([]); function handleChange(file, fileList_) { console.log(`文件 ${ file.name } 已经改变`); fileList.value = fileList_; } </script> ``` #### 解决弹窗内使用的特殊问题 需要注意的是,在某些情况下比如模态框(Modal)内部使用 `el-upload` 可能会出现一些意想不到的行为。为了避免这些问题的发生,建议采用带有条件渲染特性的指令如 `v-if` 来控制组件实例化时机,从而确保每次打开对话框时都能获得干净的状态而不会残留之前的数据[^2]。 ```html <!-- Modal.vue --> <template> <el-dialog :visible.sync="dialogVisible" width="30%"> <el-upload v-if="dialogVisible" :action="uploadUrl" multiple :limit="3" :before-upload="handleBeforeUpload" > <button>上传文件</button> </el-upload> </el-dialog> <button @click="toggleDialog()">显示/隐藏对话框</button> </template> <script setup> import { ref } from 'vue'; import { ElMessage } from 'element-plus'; const dialogVisible = ref(false); const uploadUrl = ref('https://jsonplaceholder.typicode.com/posts/'); async function handleBeforeUpload() { // 这里可以根据业务逻辑做额外处理... } function toggleDialog() { dialogVisible.value = !dialogVisible.value; } </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值