美文网首页
vue封装一个上传文件组件

vue封装一个上传文件组件

作者: 上海_前端_求内推 | 来源:发表于2021-12-16 10:35 被阅读0次

1,新建一个upload.vue

<template>
  <div>
    <!-- 文件上传start -->
    <el-upload
      drag
      :limit="limitNum"
      :auto-upload="false"
      accept=".xlsx"
      :action="UploadUrl()"
      :before-upload="beforeUploadFile"
      :before-remove="beforeRemove"
      :on-change="fileChange"
      :on-exceed="exceedFile"
      :on-success="handleSuccess"
      :on-error="handleError"
      :filelist="fileList"
    >
      <i class="el-icon-upload"></i>
      <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
      <div class="el-upload__tip" slot="tip">只能上传xlsx文件,且不超过10M</div>
    </el-upload>
    <!-- <el-button size="small" type="primary" @click="uploadFile">立即上传</el-button>
          <el-button size="small"  @click="dialogVisible = false">取消</el-button> -->
    <!-- 文件上传 end-->
  </div>
</template>
<script>
export default {
  props: ["Urldata"],
  data() {
    return {
      formselect: {},
      //文件上传
      limitNum: 1, // 上传excell时,同时允许上传的最大数
      fileList: [], // excel文件列表
      dialogVisible: true, //数据导入弹框显隐
      title: "", //弹框标题
      dialog: false, //抽屉弹框显隐
      // 表单
    };
  },
  created() {
    console.log(this.Urldata);
    // this.GetProjectList()
  },
  mounted() {},
  methods: {
    // 文件超出个数限制时的钩子
    exceedFile(files, fileList) {
      this.$message.warning(
        `只能选择 ${this.limitNum} 个文件,当前共选择了 ${
          files.length + fileList.length
        } 个`
      );
    },
    // 文件状态改变时的钩子
    fileChange(file) {
      debugger;
      this.fileList = file.raw;
      this.$emit("getUrl", this.fileList);
    },
    // 上传文件之前的钩子, 参数为上传的文件,若返回 false 或者返回 Promise 且被 reject,则停止上传
    beforeUploadFile(file) {
      console.log("before upload");
      console.log(file);
      let extension = file.name.substring(file.name.lastIndexOf(".") + 1);
      let size = file.size / 1024 / 1024;
      if (extension !== "xls") {
        this.$message.warning("只能上传后缀是.xlsx的文件");
      }
      if (size > 10) {
        this.$message.warning("文件大小不得超过10M");
      }
    },
    // 文件上传成功时的钩子
    handleSuccess(res, file, fileList) {
      debugger;
      this.$message.success("文件上传成功");
    },
    // 文件上传失败时的钩子
    handleError(err, file, fileList) {
      debugger;
      this.$message.error("文件上传失败");
    },
    UploadUrl: function () {
      // 因为action参数是必填项,我们使用二次确认进行文件上传时,直接填上传文件的url会因为没有参数导致api报404,所以这里将action设置为一个返回为空的方法就行,避免抛错
      return "";
    },
    beforeRemove(file, fileList) {
      this.fileList = fileList;
    },
    uploadFile(Urldata) {
      debugger;
      if (this.fileList == "") {
        this.$message.warning("请上传文件");
      } else {
        var form = new FormData();
        form.append("file", this.fileList);
        form.append("tableName", Urldata.tableName);
        form.append("type", Urldata.type);
        debugger;
        console.log(form);
        this.$axios({
          method: "post",
          url: Urldata.url,
          headers: {
            "Content-type": "multipart/form-data",
          },
          data: form,
        }).then(
          (res) => {
            debugger;
          },
          (err) => {}
        );
      }
    },
    //文件上传关闭
    handleClosetwo(done) {
      this.$confirm("确认关闭?")
        .then((_) => {
          done();
        })
        .catch((_) => {});
    },
  },
  watch: {
    Urldata: {
      handler: function () {
        this.uploadFile(this.Urldata);
        //do something
      },
      deep: true,
    },
  },
};
</script>
<style scoped>
</style>

2,引用upload.vue
2.1html部分

     <uploadimg
              @getUrl="getUrl"
              :Urldata="Urldata"
              :limit="3"
            ></uploadimg>

2.2js部分

import pagination from "../../components/Module/paginate.vue";//引用
 components: { pagination, uploadimg },//注册
  Urldata: {}, // excel文件列表

2.3调用只需要给Urldata赋值,会自动调用组件的监听事件,从而触发上传
 this.Urldata={url:'http://192.192.192.197:7005/api/eurekamedicalsystem/v1/medical-upload-file/uploadfile',tableName:'测试',type:'www.baidu.com3'}
2.3直接上传
    //函数
    getUrl(data1) {
      //获取上传的数据
      this.Urldata={url:'http://192.192.192.197:7005/api/eurekamedicalsystem/v1/medical-upload-file/uploadfile',tableName:'测试',type:'www.baidu.com3'}
    },

相关文章

网友评论

      本文标题:vue封装一个上传文件组件

      本文链接:https://www.haomeiwen.com/subject/cyamfrtx.html