elementUI upload组件踩坑

这篇具有很好参考价值的文章主要介绍了elementUI upload组件踩坑。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

                <el-upload
                  action="#"
                  class="upload-demo"
                  accept="image/gif,image/jpeg,image/jpg,image/png,"
                  :on-change="fileChange"
                  :http-request="requestUpload"
                  list-type="picture-card"
                  :drag="true"
                  :on-remove="removeFile"
                  :limit="1"
                  :file-list="fileList"
                  style="display: inline-block; width: 360px"
                >
                  <i slot="default" class="el-icon-plus"></i>
                </el-upload>
action

官网说的是上传的服务器地址。但是不好用。不方便自定义上传的方式和传参。注意如果action的值不是# 或者 none 后面自定义的函数 http-request将不会调用

scope-slot file

我看了网上说可以在 el-upload中间写slot 自定义上传之后显示,添加,预览按钮,下载按钮,删除按钮等。比如:

<el-upload
    action="#"
     class="upload-demo"
     accept="image/gif,image/jpeg,image/jpg,image/png,"
     :on-change="fileChange"
     :http-request="requestUpload"
     list-type="picture-card"
     :drag="true"
     :on-remove="removeFile"
     :limit="1"
     :file-list="fileList"
     style="display: inline-block; width: 360px"
   >
   <i slot="default" class="el-icon-plus"></i>
                
	<div slot="file" slot-scope="{ file }">
	 <img
	    class="el-upload-list__item-thumbnail"
	    :src="
	      (file.response && file.response.imageUrl) || require('@/assets/image/default.png')
	    "
	    alt=""
	  />
	  <span class="el-upload-list__item-actions">
	    <span class="el-upload-list__item-preview">
	      <i
	        class="el-icon-zoom-in"
	        @click="handlePictureCardPreview(file)"
	      ></i>
	    </span>
	    <!-- <span
	        v-if="!disabled"
	        class="el-upload-list__item-delete"
	      >
	        <i
	          class="el-icon-download"
	          @click="handleDownload(file)"
	        ></i>
	      </span> -->
	    <!-- <span class="el-upload-list__item-delete">
	      <i
	        class="el-icon-delete"
	        @click="handleRemove(file)"
	      ></i>
	    </span> -->
	  </span>
	</div>
</el-upload>

然后发现没有必要,并且多了很多的逻辑。组件自带的会把上传好的图片预览出来,不使用后端返回的url。自带一个删除按钮,够用了。

on-change

发现这个属性特别好用,只要文件的状态发生改变,都可以获取到最新的file和fileList。可以每次在获取最新的file的时候,做逻辑,

auto-upload

自动上传:弹开文件夹,选中文件后自动上传,这里自动调用 http-request 自定义的方法进行上传。默认是开启的。如果想在点击确定提交表单的时候上传file对象到服务器,就关闭。

http content-type

默认是 application/json 现在上传的是文件二进制流。不用专门设置 content-type 为 form-data 浏览器会自动识别 。

    fileChange(file, fileList) {
      console.log(file, fileList);
      this.fileList = fileList
      let fileType = file.name.substring(file.name.lastIndexOf(".") + 1);
      if (
        fileType !== "jpeg" &&
        fileType !== "jpg" &&
        fileType !== "png" &&
        fileType !== "gif"
      ) {
        this.fileList = [];
      }
      this.currentFile = file;
     //this.headImgUrl = URL.createObjectURL(this.currentFile.raw); 后端直接返回了imageUrl 不用设置了
    },
    // 自定义实现上传覆盖默认的方法
    requestUpload(params) {
    // params.file 也是当前上传的文件
      const that = this;
      let file = this.currentFile.raw;//注意 .raw
      let fileType = file.name.substring(file.name.lastIndexOf(".") + 1);
      if (
        fileType !== "jpeg" &&
        fileType !== "jpg" &&
        fileType !== "png" &&
        fileType !== "gif"
      ) {
        return this.$message.error("文件格式有误,请上传图片!");
      }
      console.log(params, "requestUpload");
      let formData = new FormData();
      formData.append("file", file);
      // return new Promise((resolve) => {
      // 如果返回的是 promise resolve的值会在 fileChange函数中的.response中获取到! 不返回promise也能用
        that.$api.XXX(formData).then((res) => {
          if (res.code == "200") {
            that.$message.success(res.message || "上传成功");
            that.form.imageUrl = res.imageUrl;
            // resolve(res, "res---------"); //被 fileChange response获取
          } else {
            that.$message.error(res.message || "上传失败");
            // resolve(res, "res---------");
          }
        });
      // });
    },
    removeFile(file, fileList) {
      console.log(file, fileList);
      this.fileList = fileList;
    },
limit

只允许上传一个图片,limit是1,如果再上传图片就不会走 http-request 自定义方法了,鸡肋,只能点击删除上传过图片,调用removeFile方法,然后再重新上传。一般情况下是第二张图片替换第一张图片,但是我这边是上传接口单独写的,(其实可以在fileChange 中获取到当前最新的图片,然后赋值给一个值 currentFile,提交的时候再提交后后端,auto-upload为false),就先这样不换了吧。目前的考虑就是每次选中一张就上传到服务器,服务器上会很多图片,其实提交表单的时候一起提交file最好。并且在删除图片的时候,应该把服务器上的图片也给删除,这样省去很多垃圾文件,空间也能最大化利用。

objectURL = URL.createObjectURL(object);

刚开始设计的时候,我以为必须后端返回一个url才可以预览,然后发现了还有这个方法,object就是上传的file对象(object:用于创建 URL 的 File 对象、Blob 对象或者 MediaSource 对象。),返回值是类似这样的url:blob:http://localhost:8000/257b74da-ccf3-4b2b-b7b6-281fcb4cae17。这样就不需要后端在上传成功的时候返回imageUrl给前端了。

后面还要优化 待更新。。。。

最后感谢这篇文章给我很多启发:https://blog.csdn.net/qq_42394457/article/details/96769170文章来源地址https://www.toymoban.com/news/detail-688336.html

到了这里,关于elementUI upload组件踩坑的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • B064-基础环境-前端环境 单页面组件 ElementUI Mock axios

    搭建前端项目 脚手架 1.创建一个static web项目 2.基于脚手架安装webpack环境  vue init webpack  路由前和本身yes 后no 3.运行  npm run dev 如果半路失败了,你可以直接在控制台输入:npm install 如果查看js有报错 请alt + 回车,切换es6语法 如果打开Vue页面,显示的是文本 需要在settin

    2024年02月13日
    浏览(37)
  • ElementUI —— Upload 文件上传

    前言 :            实现单文件上传!此文章仅记录代码如何实现,便于后期项目学习使用!! 代码实现 :

    2024年02月16日
    浏览(60)
  • elementUi upload上传达到limit后隐藏upload图标

    如题所述,我们项目要求上传控件最大只允许上传3张。当数量达到的时候,自动隐藏上传按钮控件。而当点击删除之前的照片后,又重新显示上传按钮控件。 这里我们选用了饿了么的elementUi里的el-upload控件作为基础,再添加我们的需求。 主要的templete如下 而对应的style如下

    2024年02月16日
    浏览(45)
  • ElementUI浅尝辄止38:Upload 上传

    通过点击或者拖拽上传文件实现上传功能,常见于文件、文件夹或图片上传,使用挺频繁的。需要熟练掌握 通过 slot 你可以传入自定义的上传按钮类型和文字提示。可通过设置 limit 和 on-exceed 来限制上传文件的个数和定义超出限制时的行为。可通过设置 before-remove 来阻止文件

    2024年02月09日
    浏览(37)
  • elementui el-upload 上传文件

    在使用element中的el-upload上传文件或者图片时,需要先把el-upload的自动上传改为手动上传:auto-upload=“false”然后el-upload内部会调用this.$refs.upload.submit();方法,从而实现多个文件上传。 提示:以下是本篇文章正文内容,下面案例可供参考 代码如下(示例): 需要注意的是 acce

    2024年02月06日
    浏览(54)
  • vue使用elementUI的upload上传文件封装

    将文件上传的方法封装一下,供大家统一调用, 话不多说,直接上代码 action 上传的地址 accept 接受上传的文件类型 multiple 是否开启多文件上传模式 limit 限制上传个数 fileList 文件列表 disabled 是否禁用 before-upload 上传文件之前的钩子. on-success 上传成功的钩子函数 on-error 文件上

    2024年02月09日
    浏览(54)
  • springboot + vue + elementui — upload解决跨域、实现图片上传

    今日记录通过elementui上传时得到的问题。 我们在本地部署的服务,前端服务请求后端接口,存在跨域问题, 跨域问题确实是由 Web浏览器的同源策略 引起的。同源策略是浏览器的一项安全机制,它限制了从一个源加载的文档或脚本如何与来自其他源的资源进行交互。 同源策略要

    2024年02月10日
    浏览(44)
  • elementUI+el-upload 上传、下载、删除文件以及文件展示列表自定义为表格展示

    官方文档 https://element.eleme.cn/#/zh-CN/component/upload 具体参数说明,如何实现上传、下载、删除等功能 action :文件上传地址,我的项目里已经封装好了请求。使用的时候需要依据项目填写。 show-file-list : 是否显示已上传文件列表。 headers :设置上传的请求头部。我的项目需要传

    2024年01月20日
    浏览(58)
  • ElementUi 关于 el-upload的自定义上传(http-request)的使用

       在开发中 遇到如下需求,要求前端传参并导入excel表格。导入失败,要弹出错误信息,同时导出错误信息的excel表格,导入成功提示信息即可。 参考官方文档,把上传需要的属性加加入使用   改造之前: 设置headers信息 在el-upload标签中加入http-request ,如下: 具体操作方法

    2024年02月01日
    浏览(40)
  • 【学习记录21】Vue+ElementUI el-upload多文件上传,一次请求上传多个文件!

    前情回顾说点废话。。。 1、项目当中遇到需要上传多个图片,一次选取多个图片。但是吧el-upload默认只能一个一个传,每次上传成功还的自己去push,一个一个去判断。 2、关键是后台给的接口,要一次性接收一堆,无奈之下只能去网上搜索,大佬们都是给的代码片段无法直

    2024年02月12日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包