el-upload文件上传的详细流程

前言

elment-ui上传

在前阵子的项目中需要和其他公司进行数据对接,其中实习生同事前来问我关于el-upload上传二进制文件的问题。所以针对我们自己对接的流程对el-upload上传文件到服务器写一个简单的流程介绍记录一下。


查看demo

el-upload提供很多正不同类型的上传组件demo的根据自己的需求先找到满足自己需求的就好了。

我们在产品需求中需要在上传的时候可以预览上传的图片详情,所以这里使用了el-upload的缩略图功能。

在我们将demo展示的代码配置到项目中之后,我们需要去查看一下element-ui为我们提供的组件配置项找到满足我们需求的功能。

 配置项详情

 element-ui官方提供的配置项有很多,根据自己的需求进行配置即可。后面大致介绍一下两种经常碰到的两种文件上传情况。

Attribute

参数说明类型可选值默认值
action必选参数,上传的地址string
headers设置上传的请求头部object
multiple是否支持多选文件boolean
data上传时附带的额外参数object
name上传的文件字段名stringfile
with-credentials支持发送 cookie 凭证信息booleanfalse
show-file-list是否显示已上传文件列表booleantrue
drag是否启用拖拽上传booleanfalse
accept接受上传的文件类型(thumbnail-mode 模式下此参数无效)string
on-preview点击文件列表中已上传的文件时的钩子function(file)
on-remove文件列表移除文件时的钩子function(file, fileList)
on-success文件上传成功时的钩子function(response, file, fileList)
on-error文件上传失败时的钩子function(err, file, fileList)
on-progress文件上传时的钩子function(event, file, fileList)
on-change文件状态改变时的钩子,添加文件、上传成功和上传失败时都会被调用function(file, fileList)
before-upload上传文件之前的钩子,参数为上传的文件,若返回 false 或者返回 Promise 且被 reject,则停止上传。function(file)
before-remove删除文件之前的钩子,参数为上传的文件和文件列表,若返回 false 或者返回 Promise 且被 reject,则停止删除。function(file, fileList)
list-type文件列表的类型stringtext/picture/picture-cardtext
auto-upload是否在选取文件后立即进行上传booleantrue
file-list上传的文件列表, 例如: [{name: 'food.jpg', url: 'https://xxx.cdn.com/xxx.jpg'}]array[]
http-request覆盖默认的上传行为,可以自定义上传的实现function
disabled是否禁用booleanfalse
limit最大允许上传个数number
on-exceed文件超出个数限制时的钩子function(files, fileList)-

Slot

name说明
trigger触发文件选择框的内容
tip提示说明文字

Methods

方法名说明参数
clearFiles清空已上传的文件列表(该方法不支持在 before-upload 中调用)
abort取消上传请求( file: fileList 中的 file 对象 )
submit手动上传文件列表

当谈到文件上传,el-upload组件是Vue.js中常用的文件上传组件之一。它提供了方便易用的界面和功能,使文件上传变得轻而易举。

首先,让我们来看看文件直接上传的方式。

 类型一:文件直接上传

 

//类型一:文件直接上传
<template>
  <el-upload
    action="/api/upload"
    :before-upload="beforeUpload"
    :on-success="uploadSuccess"
    :on-error="uploadError">
    <el-button icon="el-icon-upload">点击上传</el-button>
  </el-upload>
</template>

<script>
export default {
  methods: {
    beforeUpload(file) {
      // 可以在这里进行文件格式、大小等的判断
      console.log('beforeUpload', file);
    },
    uploadSuccess(response, file) {
      // 上传成功后的处理
      console.log('uploadSuccess', response, file);
    },
    uploadError(error, file) {
      // 上传失败后的处理
      console.log('uploadError', error, file);
    }
  }
}
</script>

在上述代码中,我们利用el-upload组件实现了一个简单的文件上传功能。action属性指定了文件上传的地址,你可以根据实际需求进行修改。在before-upload属性中,可以添加逻辑判断来限制文件的格式、大小等。在on-success和on-error属性中,我们定义了文件上传成功和失败后的回调函数,你可以在这里进行相关的处理操作。

 类型二:获取文件数据进行赋值字段上传

 有时候,我们需要在文件上传的同时,将一些其他字段的值进行提交。下面是一个详细的示例。

//类型二:获取文件数据进行赋值字段上传
<template>
  <el-form :model="form" label-width="80px">
    <el-form-item label="姓名">
      <el-input v-model="form.name"></el-input>
    </el-form-item>
    <el-form-item label="头像">
      <el-upload
        action="/api/upload"
        :before-upload="beforeUpload"
        :on-success="uploadSuccess"
        :on-error="uploadError"
        :data="extraData">
        <el-button icon="el-icon-upload">点击上传</el-button>
      </el-upload>
    </el-form-item>
    <el-form-item>
      <el-button type="primary" @click="submit">提交</el-button>
    </el-form-item>
  </el-form>
</template>

<script>
export default {
  data() {
    return {
      form: {
        name: '',
        avatar: ''
      },
      extraData: {}
    }
  },
  methods: {
    beforeUpload(file) {
      console.log('beforeUpload', file);
      // 在上传前,将其他字段的值赋给extraData
      this.extraData = {
        name: this.form.name
      };
    },
    uploadSuccess(response, file) {
      console.log('uploadSuccess', response, file);
      // 上传成功后,更新form中的avatar字段
      this.form.avatar = response.data.url;
    },
    uploadError(error, file) {
      console.log('uploadError', error, file);
    },
    submit() {
      // 在这里可以通过API将form中的数据进行提交,包括name和avatar字段
      console.log('表单数据', this.form);
    }
  }
}
</script>
  1. 在上述代码中,我们使用了el-form和el-form-item来创建一个表单。其中,form对象用于保存表单数据,extraData对象用于额外的上传数据。
  2. 在before-upload属性中,我们将表单中的name字段赋值给extraData对象,从而实现了文件上传和其他字段上传的同时进行。
  3. 在uploadSuccess回调函数中,我们从上传成功的响应中取得文件的URL,并将其赋值给表单中的avatar字段。
  4. 最后,在提交表单时,你可以通过API将表单数据进行提交,包括name和avatar字段。 

 

### 实现文件上传过程中的 Loading 动画 为了在 `element-ui` 的 `el-upload` 组件中实现文件上传时的加载动画效果,可以利用 Vue.js 提供的状态管理机制来控制加载状态。具体来说,在发起上传请求之前开启加载动画,并在网络响应返回后再关闭该动画。 #### 方法一:通过自定义指令或事件监听器处理 可以在提交表单前设置一个布尔类型的变量用于追踪当前是否有正在进行的网络请求: ```javascript data() { return { loading: false, }; }, methods: { handleBeforeUpload(file) { this.loading = true; // 可选操作:在此处执行其他逻辑 return true; // 返回true允许继续上传流程;false则阻止上传 }, handleError(err, file, fileList){ console.error("Error occurred during upload:", err); this.loading = false; }, handleSuccess(response, file, fileList){ setTimeout(() => {this.loading = false}, 1000); // 延迟一秒模拟服务器端处理时间 } } ``` 然后将这些钩子函数绑定到 `<el-upload>` 上对应的属性上[^1]。 对于整个页面范围内的全局加载遮罩层,则推荐使用 Element Plus 自带的 `Loading` Service 来创建覆盖全屏的效果: ```html <template> <!-- ... --> <div v-loading="loading"> <el-upload :before-upload="handleBeforeUpload" :on-error="handleError" :on-success="handleSuccess"> Click to Upload File </el-upload> </div> </template> <script setup lang="ts"> import { ref } from "vue"; const loading = ref(false); // 定义上述提到的方法... </script> ``` 这样当有文件正在被上传的时候就会自动显示出加载图标直到完成为止[^2]。 另外一种方式是在每次触发上传动作的同时启动局部加载指示符,这可以通过配置项 `list-type="picture-card"` 或者直接给定样式类名 `.el-icon-loading` 到按钮上来达成目的[^3]。 #### 方法二:基于 Axios 请求拦截器的方式 如果项目已经集成了 axios 库作为 HTTP 客户端的话,还可以考虑采用更通用的做法——即借助于 axios 的请求/响应拦截功能来进行统一管理: ```javascript axios.interceptors.request.use((config) => { store.commit('SET_LOADING', true); return config; }); axios.interceptors.response.use( (response) => { store.commit('SET_LOADING', false); return response; }, (error) => { store.commit('SET_LOADING', false); Promise.reject(error); } ); ``` 这里假设存在 Vuex Store 中的一个 mutation 名叫 SET_LOADING 负责更新应用级别的加载标志位。这种方式的好处在于它不仅适用于文件上传场景下的加载提示,而且能够作用于所有的异步数据交互场合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值