圖片上傳組件

<template>
  <div class="uploadTest">
    <div
      class="wran-hasImg wran"
      :style="{width:width+'px',height:height+'px'}"
      v-show="!hasImg"
      @click="add($event)"
    >
      <div class="add-wran">
        <i class="iconfont icon-add action"></i>
      </div>
    </div>
    <div v-show="hasImg" class="wran-hasNotImg wran" :style="{width:width+'px',height:height+'px'}">
      <i class="iconfont icon-delete action" @click="del($event)"></i>
      <img ref="curImg" class="curImg" :style="{width:width+'px',height:height+'px'}" />
      <div class="mask"></div>
    </div>
    <input
      ref="uploadDom"
      type="file"
      id="inputBox"
      style="border:none;display:none;"
      @change="selectImageURL"
      accept="image/*"
    />
  </div>
</template>
<script>
import Axios from "axios";
export default {
  name: "upload", // 內(nèi)飾
  props: {
    y: {
      // 嵌套多張圖片時(shí)的標(biāo)記
      type: Number,
      default: 0
    },
    index: {
      // 多張圖片時(shí)的標(biāo)記
      type: Number,
      default: 0
    },
    url: {
      // 云服務(wù)地址
      type: String,
      default: "https://dev.huaweidun.com:812/api/Tools/WebUpload"
    },
    imgBackFlag: {
      // 是否回顯圖片
      type: Boolean,
      default: false
    },
    propCurrentImg: {
      // 傳入圖片地址
      type: String,
      default: ""
    },
    width: {
      // 寬度
      type: Number,
      default: 100
    },
    height: {
      // 高度
      type: Number,
      default: 100
    },
    maxSize: {
      // 最大尺寸
      // 可接收?qǐng)D片最大尺寸 單位 MB
      type: Number,
      default: 250
    },
    minSize: {
      // 可接收最小尺寸
      type: Number,
      default: 0
    },
    //jpg仅胞,png乳幸,tif,gif
    accept: {
      type: Array,
      default: () => ["jpg", "png", "gif"]
    }
  },
  data() {
    return {
      hasImg: false,
      currentImg: ""
    };
  },
  created() {},
  mounted() {
    if (this.imgBackFlag && this.propCurrentImg != "") {
      this.hasImg = this.imgBackFlag;
      this.$refs.curImg.src = this.propCurrentImg;
    }
  },
  watch: {
    propCurrentImg(newV, oldV) {
      if (this.imgBackFlag) {
        this.hasImg = this.imgBackFlag;
        if (this.propCurrentImg) {
          this.$refs.curImg.src = this.propCurrentImg;
        } else {
          this.$refs.curImg.src = null;
          this.$refs.uploadDom.value = "";
          this.hasImg = false;
        }
      }
    }
  },
  methods: {
    add(e) {
      if (this.hasImg) {
      } else {
        this.$refs.uploadDom.click();
      }
    },
    del(e) {
      this.$refs.curImg.src = null;
      this.$refs.uploadDom.value = "";
      this.hasImg = false;
      this.$emit("on-delete", "內(nèi)容已清空", this.index, this.y);
    },
    // 上傳圖片
    selectImageURL(e) {
      let file = e.target.files[0];
      let fileName = e.target.value;
      let fileType = fileName
        .substring(fileName.lastIndexOf(".") + 1, fileName.length)
        .toLowerCase();
      if (this.accept.includes(fileType)) {
        // console.log("該類(lèi)型可以用  ", fileType);
        this.sizeFormate(e, file, fileType);
      } else {
        this.$emit(
          "on-format-error",
          file,
          "文件格式錯(cuò)誤!當(dāng)前格式" + fileType + "可接收類(lèi)型",
          JSON.stringify(this.accept),
          this.index
        );
        this.$refs.uploadDom.value = "";
      }
    },
    sizeFormate(e, file, fileType) {
      // console.log("file ", file);
      let fileSize = 0;
      let bFomateMB = 1024 * 1024; //1M
      if (file) {
        fileSize = file.size;
        // console.log("fileSize ", fileSize);
        let curSizeMb = fileSize / bFomateMB;
        // 判斷當(dāng)前 文件大小 是否大于 maxSize
        if (curSizeMb > this.maxSize) {
          // console.log("文件不能大于" + this.maxSize + "MB植榕!");
          this.$emit(
            "on-exceeded-size",
            file,
            "上傳文件不能大于" + this.maxSize + "MB",
            this.index
          );
          this.$refs.uploadDom.value = "";
          // 判斷當(dāng)前文件 大小 是否 小于0
        } else if (curSizeMb <= 0) {
          // console.log("文件大小不能為0MB!");
          this.$emit("on-exceeded-size", file, "文件大小不能為0MB");
          this.$refs.uploadDom.value = "";
        } else {
          /* 圖片傳輸 部分 */
          // param.append("chunk", "0"); // 添加form表單中其他數(shù)據(jù)
          // console.log(param.get("file")); // FormData私有類(lèi)對(duì)象,訪問(wèn)不到祈餐,可以通過(guò)get判斷值是否傳進(jìn)去
          let config = {
            headers: { "Content-Type": "multipart/form-data" }
          };
          // 添加請(qǐng)求頭
          let img = new Image();
          let timestamp = Date.parse(new Date());
          Axios.get(this.url)
            .then(res => {
              // console.log("res ", JSON.stringify(res.data));
              let param = new FormData(); // 創(chuàng)建form對(duì)象
              param.append("name", file.name);
              param.append(
                "key",
                `${res.data.dir}${file.name}${timestamp}.${fileType}`
              );
              param.append("policy", res.data.policy);
              param.append("OSSAccessKeyId", res.data.accessid);
              param.append("success_action_status", 200);
              param.append("signature", res.data.signature);
              param.append("callback", res.data.callback);
              param.append("dir", res.data.dir);
              param.append("file", file); // 通過(guò)append向form對(duì)象添加數(shù)據(jù)
              let uploadUrl = res.data.host;
              // console.log(uploadUrl, res.data.host)
              let img = new Image();
              Axios.post(uploadUrl, param)
                .then(res2 => {
                  // console.log("res2222.data.imgUrl ", res2.data.imgUrl);
                  if (res2.data.status === "Ok") {
                    // console.log("res2.data.imgUrl ", res2.data.imgUrl);
                    let successImgUrl = res2.data.imgUrl;
                    this.$emit(
                      "on-success",
                      successImgUrl,
                      file,
                      this.index,
                      this.y
                    );
                    img.onload = () => {
                      this.hasImg = true;
                      console.log("this.hasImg ", this.hasImg);
                      this.$nextTick(() => {
                        console.log("this.$refs.curImg. ", this.$refs.curImg);
                        this.$refs.curImg.src = successImgUrl;
                      });
                      // this.$refs.curImg.src = successImgUrl;
                      img.onload = null;
                    };
                    img.src = successImgUrl;
                  }
                })
                .catch(err => {
                  // console.log(err);
                });
            })
            .catch(res => {});
        }
      } else {
        // console.log("文件不存在");
      }
    }
  }
};
</script>
<style scoped lang="less">
@font-face {
  font-family: "iconfont";
  src: url("http://at.alicdn.com/t/font_1744626_0tlyf9dhykx.eot?t=1586424643369"); /* IE9 */
  src: url("http://at.alicdn.com/t/font_1744626_0tlyf9dhykx.eot?t=1586424643369#iefix")
      format("embedded-opentype"),
    /* IE6-IE8 */
      url("data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAAMUAAsAAAAABwwAAALIAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCDBgqBdIFnATYCJAMMCwgABCAFhG0HNhstBsiemjzaRMtKisYAS5+VAHhDfrn2vs3mrikiKmD3gap4POu6GsESwTFoFvrMWLMU8IEcR6gnyaCK9mgPKJ007UyFc0/Gl4eH+73nvn8XBdYis42iOYs2rsBOLxvQzJLXGom1yXzi3mkTKJD5LMtljnH+qQswDiigsTZ1kRRIgt4wdsELPAwE8BAjC3W8fA2oTbJHEYCWksildiFMkiynEL1hYaIzlFHFvjgHsBB9n/5QEAoErcSe2Ln4HNDd18dXBE8Zu8YDEiTLOQGwZQADsgASaLIxPaiGGIN5qOvdpTqJiKVixpJIbCh15w8PEAionF3tBQDSkFF4KInHAwFfSJ+6mgGADrMdCEOYHlRItPrakLQ7bKzW9pYOXhS1PnP3tca7YB6+B9cJ6t610u8MumQeWhmOKwOq3u1Wex3sh1adzzfF3ht3sZpHbU1WT3lfbI1Dk2l9q97fJ7wQz7eP7KJv+b9F8aB8t40sRcLhYu+el+PgLBp2yEzO9Fo6PPt8i0q67SRn8iUnZdIFAw8Teyjvch2Rcco7XPGzf4NjMT61cfWvahIAvObVGIWMU4nhFVAEMMmvlQysk4bMtnBqYk9s5VgO7cZN8DB8MGD7A3xO1wffvpOogoRBcBMNpiSRJT0LGk9F0Cm18JCpdbmnQONqKKsAGeYBiJ91CD4OwPxckCX9A5oQ/9D5BcNDf+xs6CklhruPCtcQsGXBw76UoWuzblzbQzTLXc3LIuYIOk1inJ+TV869ooQuMWViHp1PWsgOlYJbwHHIc+FRlRS+HbvMJhe5uY6mFx1bpaCuRgpcBgLMYoEN84lSGDQ33crneyAyk3NpB6HOPwJqKmmf5cuRN4D8qi4HER7lmQlzkXOTTIg5KFFgLaAf5HKCjTb3S4HPHHNNSE5cyHUaOYaqj7fXFv+3BcCDvRtHEaVIPBMEzQA5DEQ=")
      format("woff2"),
    url("http://at.alicdn.com/t/font_1744626_0tlyf9dhykx.woff?t=1586424643369")
      format("woff"),
    url("http://at.alicdn.com/t/font_1744626_0tlyf9dhykx.ttf?t=1586424643369")
      format("truetype"),
    /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */
      url("http://at.alicdn.com/t/font_1744626_0tlyf9dhykx.svg?t=1586424643369#iconfont")
      format("svg"); /* iOS 4.1- */
}

.iconfont {
  font-family: "iconfont" !important;
  font-size: 16px;
  font-style: normal;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}
.icon-add:before {
  content: "\e81a";
}
.icon-delete:before {
  content: "\e7b2";
}
.wran-hasImg {
  position: relative;
  border: 1px solid #ccc;
  .add-wran {
    height: 100%;
    width: 100%;
    display: flex;
    justify-content: center;
    align-items: center;
    z-index: 999;
    .icon-add {
      font-size: 30px;
      &:hover {
        font-size: 35px;
        cursor: pointer;
      }
    }
  }
}
.wran-hasNotImg {
  position: relative;
  .curImg {
  }
  .icon-delete {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    font-size: 50px;
    color: rgb(255, 255, 255);
    display: none;
  }
  &:hover .icon-delete {
    display: block;
    z-index: 99999;
  }
  &:hover .mask {
    display: block;
    opacity: 1;
  }
  .mask {
    position: absolute;
    display: none;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background: rgba(101, 101, 101, 0.6);
    color: #ffffff;
    opacity: 0;
  }
}
.uploadTest {
  cursor: pointer;
}
</style>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市哄陶,隨后出現(xiàn)的幾起案子帆阳,更是在濱河造成了極大的恐慌,老刑警劉巖屋吨,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜒谤,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡至扰,警方通過(guò)查閱死者的電腦和手機(jī)鳍徽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)敢课,“玉大人旬盯,你說(shuō)我怎么就攤上這事◆崦停” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵接剩,是天一觀的道長(zhǎng)切厘。 經(jīng)常有香客問(wèn)我,道長(zhǎng)懊缺,這世上最難降的妖魔是什么疫稿? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮鹃两,結(jié)果婚禮上遗座,老公的妹妹穿的比我還像新娘。我一直安慰自己俊扳,他們只是感情好途蒋,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著馋记,像睡著了一般号坡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上梯醒,一...
    開(kāi)封第一講書(shū)人閱讀 50,084評(píng)論 1 291
  • 那天宽堆,我揣著相機(jī)與錄音,去河邊找鬼茸习。 笑死畜隶,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播籽慢,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼浸遗,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了嗡综?” 一聲冷哼從身側(cè)響起乙帮,我...
    開(kāi)封第一講書(shū)人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎极景,沒(méi)想到半個(gè)月后察净,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡盼樟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年氢卡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晨缴。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡译秦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出击碗,到底是詐尸還是另有隱情筑悴,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布稍途,位于F島的核電站阁吝,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏械拍。R本人自食惡果不足惜突勇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望坷虑。 院中可真熱鬧甲馋,春花似錦、人聲如沸迄损。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)芹敌。三九已至共屈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間党窜,已是汗流浹背拗引。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留幌衣,地道東北人矾削。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓壤玫,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親哼凯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子欲间,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容