elementuiplus附件上传

本文详细介绍了如何在ElementUIPlus中使用手动上传附件的方法,包括设置`Content-Type`为`multipart/form-data`,禁用自动上传并提供`handleFileChange`处理函数。遇到上传问题,请务必先确认后端配置。关键步骤包括创建`newFormData`对象并附参数,同时提醒了文件类型验证和v-model绑定的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

elementuiPlus附件上传方式:
一:自动上传:
自动上传只需按照文档操作即可

二:手动上传:
注意:下面的手动上传方式一定是正确的,前端正确执行以下步骤之后如果上传不成功,请找后端 ,不成功必定是后端怀疑
坚定点 请不要怀疑自己错了,否则你会浪费很多联调时间

三步走:

步骤一:手动提交headers一定是multipart/form-data格式
headers: {
‘Content-Type’: ‘multipart/form-data’,
},

步骤二:
:auto-upload=“false” 必须设置为false
:on-change=“handleFileChange” handleFileChange方法获取提交的数据

步骤三:
(1)创建new FormData 对象
(2)通过append方法提交参数

/*添加对账附件*/
const addAttachment = (params: any) => {
  return request({
    url: '/admin/financeAttachment/importAttachment.do',
    method: 'POST',
    data: params,
    headers: {
      'Content-Type': 'multipart/form-data',
    },
  })
}


<el-upload
            style="width: 100%"
            ref="uploadRef"
            :limit="1"
            :on-change="handleFileChange"
            v-model:file-list="dataForm.fileList"
            accept=".xlsx, .xls"
            :auto-upload="false"
            class="uploadFile"
            :disabled="dataForm.id == '' ? false : true"
          >
            <el-button
              size="middle"
              type="primary"
              v-if="dataForm.id == ''"
              style="margin-top: -105px"
              >点击上传</el-button
            >
          </el-upload>


  const handleFileChange = (file, fileList) => {
    console.log(file, fileList, 'fileList===')
    const isExcel =
      file.raw.type === 'application/vnd.ms-excel' ||
      file.raw.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
    if (!isExcel) {
      uploadRef.value?.clearFiles()
      return ElMessage.error('附件不是Excel文档,请重新上传')
    }

    let filename = file.name.substring(0, file.name.lastIndexOf('.'))
    if (filename.length > 30) {
      fileList.value = []
      uploadRef.value?.clearFiles()
      return ElMessage.error('附件的文件名不能超30字,请重新上传')
    }
    uploadFile.value = file
    dataForm.fileList = [
      {
        name: file.name,
        url: '',
      },
    ]

    console.log(uploadFile.value, 'filename===', file.raw)
  }
 清空附件通过调取方法 因为手动赋值为空是不生效的
 
 uploadRef.value?.clearFiles()
-----------------------------------------------------------------------------------------------------------------------
提交
1:new FormData()
2:通过append方法插入参数

const onSubmitForm = async (formEl: FormInstance | undefined) => {
    if (!formEl) return
    let formData = new FormData()
    let dataObj = {
      checkDate: dataForm.checkDate,
      endDate: dataForm.endDate,
      remark: dataForm.remark,
      deadline: dataForm.deadline,
      fileType: dataForm.type,
      fileTypeName: uploadForm.data.name,
    }
    // classifyLists.value.find((item) => item.dicCode == dataForm.type).dicValue
    formData.append('file', uploadFile.value.raw)
    formData.append('checkDate', dataForm.checkDate)
    formData.append('endDate', dataForm.endDate)
    formData.append('deadline', dataForm.deadline)
    formData.append('fileType', dataForm.type)
})

补充:附件必传的校验 易错点:将v-model:file-list=""绑定在 el-form的v-model未包含的数组、

错误写法:
const fileList = ref([]) //


 v-model:file-list="fileList "

正确写法:
const dataForm = reactive({fileList:[]})	
 v-model:file-list="dataForm.fileList"
 
因为el-form绑定的v-model是dataForm 而非fileList 

<el-form size="large" ref="dataFormRef" :model="dataForm" :rules="rules" label-width="80px">
   
        <el-form-item label="附件" prop="fileList">
          <el-upload
            style="width: 100%"
            ref="uploadRef"
            :limit="1"
            :on-change="handleFileChange"
            v-model:file-list="dataForm.fileList"
            accept=".xlsx, .xls"
            :auto-upload="false"
            class="uploadFile"
            :disabled="dataForm.id == '' ? false : true"
          >
            <el-button
              size="middle"
              type="primary"
              v-if="dataForm.id == ''"
              style="margin-top: -105px"
              >点击上传</el-button
            >
          </el-upload>
        </el-form-item>
        </el-form>
<think>我们正在使用ElementPlus(ElementUI的Vue3版本)来实现头像上传功能。根据引用内容,我们注意到一些关键点:1.前端使用ElementUI(或ElementPlus)的<el-upload>组件。2.需要处理上传前(before-upload)和上传成功(on-success)的回调。3.头像上传后需要显示图片(使用:src绑定)。另外,引用[1]和[2]提供了示例代码,我们可以参考,但需要注意ElementPlus与ElementUI的一些差异(例如事件名称可能不同)。步骤:1.在模板中放置<el-upload>组件,并设置必要的属性。2.设置action为后端上传接口的URL(如果是本地开发,注意代理跨域问题,引用[2]中使用了"/api"前缀,通过代理解决跨域)。3.设置显示方式为头像,可以使用`list-type="picture-card"`或者使用头像专用的显示方式(ElementPlus中还有<el-avatar>组件,但上传还是用<el-upload>)。4.设置`show-file-list`为false,因为我们只上传一个头像。5.定义`beforeAvatarUpload`方法,用于上传前的文件校验(例如文件类型、大小)。6.定义`handleAvatarSuccess`方法,用于处理上传成功后的响应,将返回的图片URL赋值给绑定的变量,从而显示头像。注意:在ElementPlus中,事件名称是`on-success`(在ElementUI中也是同样的),所以我们可以保持。另外,引用[3]提到了七牛上传,但我们这里假设是上传到自己的后端。根据引用[4],我们可以将API请求方法挂载到Vue原型上,但在这个示例中,我们为了简单,直接写action。由于我们使用ElementPlus,请确保已经正确安装并引入了ElementPlus。下面是一个具体的代码示例(Vue3+ElementPlus):</think> 在Element Plus中实现头像上传功能,可通过以下步骤完成(基于Vue 3): ```html <template> <el-upload action="/api/upload" <!-- 替换为实际后端接口 --> :show-file-list="false" :on-success="handleAvatarSuccess" :before-upload="beforeAvatarUpload" > <el-avatar :size="100" :src="imageUrl"> <span v-if="!imageUrl">点击上传</span> </el-avatar> </el-upload> </template> <script setup> import { ref } from 'vue'; import { ElMessage } from 'element-plus'; const imageUrl = ref(''); // 存储头像URL // 上传前校验 const beforeAvatarUpload = (file) => { const isImage = file.type.startsWith('image/'); const isLt2M = file.size / 1024 / 1024 < 2; if (!isImage) ElMessage.error('请上传图片格式文件!'); if (!isLt2M) ElMessage.error('图片大小不能超过 2MB!'); return isImage && isLt2M; }; // 上传成功回调 const handleAvatarSuccess = (response) => { if (response.code === 200) { imageUrl.value = response.data.url; // 根据后端返回结构调整 ElMessage.success('头像上传成功'); } else { ElMessage.error('上传失败:' + response.message); } }; </script> ``` ### 关键配置说明: 1. **action属性**:指向后端上传接口 - 开发环境建议配置代理(如`vite.config.js`): ```javascript server: { proxy: { '/api': { target: 'http://localhost:8080', // 后端地址 changeOrigin: true } } } ``` 2. **头像显示**: - 使用`<el-avatar>`组件替代`<img>`标签 - `imageUrl`绑定上传返回的图片路径 3. **验证规则**: - `beforeAvatarUpload`验证文件类型和大小(示例限制2MB) - 返回`false`会阻止上传 4. **后端要求**: - 需返回结构化数据,示例格式: ```json { "code": 200, "data": { "url": "/uploads/avatar.jpg" }, "message": "success" } ``` ### 相关优化建议: 1. **裁剪功能**:集成第三方库(如`vue-cropper`)实现图片裁剪 2. **进度显示**:添加`:on-progress`事件显示上传进度条 3. **令牌验证**:若使用七牛云等OSS服务,参考引用[3]动态获取token 4. **默认头像**:当`imageUrl`为空时显示系统默认头像 > 完整实现参考:[Element Plus Upload文档](https://element-plus.org/en-US/component/upload.html)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值