【VUE3+elementPlus+typeScript】解决el-upload组件文件校验不通过时预览文件仍然显示的问题

解决el-upload组件文件校验不通过时预览文件仍然显示的问题

场景

我的文件要与表单一起,点击保存按钮时才进行上传提交。
文件要求:

  • 仅支持word/excel/jpg/png/rar格式;
  • 单个文件不超过100M;
  • 最多可以添加10个文件。
    在这里插入图片描述
    原始代码:
 <el-upload v-model:file-list="form.addFiles" class="upload"
                   :on-change="handleOnUploadChange" :auto-upload="false"
                   :before-remove="handleBeforeRemove" :limit="10" :on-exceed="handleExceed">
          <template #tip>
            <div class="el-upload__tip">
              支持word/excel/jpg/png/rar类型文件,单个文件不超过100M。
            </div>
          </template>
          <el-button class="btn-add-affix" type="primary">
            添加附件
          </el-button>
</el-upload>
const allowedTypes = ['application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
  'application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
  'image/jpeg', 'image/png', 'application/x-rar-compressed'];

function handleOnUploadChange(uploadFile: any) {
  console.log("onUploadChange", uploadFile);
  if (!allowedTypes.includes(uploadFile.raw.type)) {
    ElMessage.error('文件格式不支持,请重新上传!')
    return
  }

  if (uploadFile.size / 1024 / 1024 > 100) {
    ElMessage.error('单个文件大小不能超过100MB!')
    return
  }
}

此时我发现加上这段代码之后,即使上传pdf类型的文件(不通过格式类型),在预览区域仍然可以显示该文件。

解决:

由于auto-upload = false,在beforeUpload钩子函数里不会触发,与on-Change钩子函数冲突
最终校验逻辑加在on-change方法里。
只需要在文件校验不通过时从列表中删除该文件即可删除预览区域的显示。具体逻辑如下:

function handleOnUploadChange(uploadFile: any) {
  console.log("onUploadChange", uploadFile);
  if (!allowedTypes.includes(uploadFile.raw.type)) {
    ElMessage.error('文件格式不支持,请重新上传!')
    handleRemove(uploadFile, form.value.addFiles)
    return
  }

  if (uploadFile.size / 1024 / 1024 > 100) {
    ElMessage.error('单个文件大小不能超过100MB!')
    handleRemove(uploadFile, form.value.addFiles)
    return
  }
}
/**
* 从addFiles列表中删除不合规的文件
* @param file: 指当前添加的附件
* 		 addFileList: 指表单数据addFiles
*/
function handleRemove(file:any, addFileList:any) {
  let index = -1;
  addFileList.forEach((e:any, i:any) => {
    if (e.uid == file.uid) {
      index = i;
    }
  });
  if(index >= 0){
    addFileList.splice(index, 1);
  }
}
### 实现 Vue3Element Plus 的 OSS 图片上传 为了实现一个完整的对象存储服务(OSS)图片上传功能,可以利用 Vue3 结合 Element Plus 组件库来创建高效的前端界面。下面是一个详细的解决方案以及相应的示例代码。 #### 创建文件上传组件 通过使用 `el-upload` 组件,能够轻松集成阿里云或其他服务商提供的 OSS SDK 来处理实际的文件传输逻辑[^1]: ```html <template> <div class="upload-demo"> <!-- 使用 el-upload 提供的基础配置 --> <el-upload :action="ossConfig.action" :data="getExtraData()" list-type="picture-card" :on-preview="handlePictureCardPreview" :before-upload="beforeAvatarUpload" :on-success="handleSuccess" :file-list="fileList" > <i class="el-icon-plus"></i> </el-upload> <!-- 预览对话框 --> <el-dialog v-model="dialogVisible" size="tiny"> <img width="100%" :src="dialogImageUrl" alt="" /> </el-dialog> </div> </template> ``` #### 处理上传事件的方法定义 在 JavaScriptTypeScript 中编写业务逻辑函数用于控制上传行为并获取必要的参数[^2]: ```javascript <script lang="ts"> import { defineComponent, ref } from &#39;vue&#39;; export default defineComponent({ setup() { const fileList = ref([]); const dialogImageUrl = ref(&#39;&#39;); const dialogVisible = ref(false); // 获取额外的数据项 (例如签名等) function getExtraData(){ return { key: &#39;&#39;, // 对象名称 policy: &#39;&#39;, signature: &#39;&#39; /* ...其他必要字段 */ } } // 文件预览回调 function handlePictureCardPreview(file){ dialogImageUrl.value = file.url; dialogVisible.value = true; } // 成功后的钩子方法 function handleSuccess(response, file){ console.log(&#39;File uploaded successfully:&#39;, response.data); fileList.value.push({name: file.name, url: response.data}); } // 上传前校验 function beforeAvatarUpload(file){ const isJPGorPNG = [&#39;image/jpeg&#39;, &#39;image/png&#39;].includes(file.type); if (!isJPGorPNG) { ElMessage.error(&#39;仅支持 JPG/PNG 格式的图片!&#39;); } const isValidSize = file.size / 1024 / 1024 < 2; // 超过2MB大小 if (!isValidSize ) { ElMessage.error(&#39;图片大小得超过 2 MB!&#39;); } return isJPGorPNG && isValidSize ; } return { fileList, dialogImageUrl, dialogVisible, getExtraData, handlePictureCardPreview, handleSuccess, beforeAvatarUpload }; }, }) </script> ``` 此段代码展示了如何设置一个基本的图片上传表单,并且包含了对上传过程中的各种状态管理和错误提示的支持。需要注意的是,在真实的生产环境中还需要考虑安全性问题,比如请求鉴权、跨域资源共享(CORS)策略等方面的内容[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值