Vue上传图片到oss

参考:九宫格(图片上传)

           实现oss签名直传

            自定义图标

最终样式:


1.html代码

<div class="uploadImage">

        <input

          @change="fileChange($event)"

          type="file"

          id="upload_file"

          multiple

          style="display: none"

        >

        <p class="title titlepay">请上传图片(最多3张)</p>

        <div class="add-img">

          <ul class="img-list">

            <li v-for="(url, index) in imgList" :key="index">

              <div>

                <img

                  class="del"

                  src="../../assets/close-circle.png" //删除的图标路径

                  @click.stop="delImg(index)"

                  v-if="payEvidence==''"

                >

                <img class="app-bg" :src="url.file.src">

              </div>

            </li>

            <li class="add" @click="chooseType" v-show="show" v-if="payEvidence==''">

              <div class="add-image" align="center">

                <van-icon class="icon-camera" name="camera" custom></van-icon> //相机的图标

                <p class="font13" style="center">添加图片</p>

              </div>

            </li>

          </ul>

        </div>

      </div>

      <div class="btn">

        <van-button

          class="interval-normal-b"

          @click="submit"

          size="large"

          v-if="payEvidence==''"

        >确认提交</van-button>

      </div>

    </div>

2.style样式

//按钮
.checked {

  font-size: 80px;

  color: #38bb14;

}

.van-button--large {

  height: 40px;

  line-height: 40px;

  margin-top: 30px;

}

.van-button--default {

  color: #ffff;

  background-color: #4bd126;

}

//图片上传

.app-bg > img {

  width: 100%;

  height: 100%;

  -webkit-transform: scale(1.03);

  -moz-transform: scale(1.03);

  -ms-transform: scale(1.03);

  -o-transform: scale(1.03);

  transform: scale(1.03);

}

.add-img {

  width: 100%;

  padding-top: 8px;

}

.add-img p {

  color: #999;

}

.add {

  display: inline-block;

  margin-bottom: 20px;

  text-align: center !important;

}

.add-image p {

  text-align: center !important;

}

.add-image {

  border: 1px dashed rgba(0, 0, 0, 0.2);

}

.add-image .icon-camera {

  margin-top: 25px;

  font-size: 30px;

}

.mui-btn-block {

  border: 0;

  border-radius: 0;

  background-color: #87582e;

  color: #fff;

  margin-bottom: 0;

  bottom: 0;

}

.mui-buttom {

  position: fixed;

  width: 100%;

  bottom: 0;

  z-index: 999;

}

/*九宫格*/

.img-list {

  overflow: hidden;

  padding: 10px 12px;

  padding-top: 0;

}

.img-list > li {

  float: left;

  width: 32%;

  text-align: center;

  padding-top: 31%;

  margin-left: 1%;

  margin-top: 1%;

  margin-bottom: 20px;

  position: relative;

}

.img-list > li > div {

  position: absolute;

  left: 0;

  top: 0;

  width: 100%;

  height: 100%;

  overflow: hidden;

}

.img-list > li > div .app-bg {

  width: 100%;

  height: 100%;

}

.mui-fullscreen {

  z-index: 9999;

}

.del {

  position: absolute;

  width: 18px;

  top: 0;

  right: 0;

  z-index: 999;

}

3.script代码

<script>

import axios from 'axios';  //可解决测试时的跨域问题

export default P({

  name: "x-address-edit",

  title: "图片上传",

  data() {

    return {

      imgList: [],

      size: 0,

      limit: 3, //限制图片上传的数量

      show: true,

      payEvidence: ""

    };

  },

  methods: {

    chooseType() {

      document.getElementById("upload_file").click();

    },

    fileChange(el) {

      if (!el.target.files[0].size) return;

      this.fileList(el.target);

      el.target.value = "";

    },

    fileList(fileList) {

      let files = fileList.files;

      for (let i = 0; i < files.length; i++) {

        //判断是否为文件夹

        if (files[i].type != "") {

          this.fileAdd(files[i]);

        } else {

          //文件夹处理

          this.folders(fileList.items[i]);

        }

      }

    },

    //文件夹处理

    folders(files) {

      let _this = this;

      //判断是否为原生file

      if (files.kind) {

        files = files.webkitGetAsEntry();

      }

      files.createReader().readEntries(function(file) {

        for (let i = 0; i < file.length; i++) {

          if (file[i].isFile) {

            _this.foldersAdd(file[i]);

          } else {

            _this.folders(file[i]);

          }

        }

      });

    },

    foldersAdd(entry) {

      let _this = this;

      entry.file(function(file) {

        _this.fileAdd(file);

      });

    },

    fileAdd(file) {

      if (this.limit !== undefined) this.limit--;

      if (this.limit !== undefined && this.limit < 0) return;

      //总大小

      this.size = this.size + file.size;

      //判断是否为图片文件

      if (file.type.indexOf("image") == -1) {

        this.$toast("请选择图片文件");

      } else {

        let reader = new FileReader();

        let image = new Image();

        let _this = this;

        reader.readAsDataURL(file);

        reader.onload = function() {

          file.src = this.result;

          image.onload = function() {

            let width = image.width;

            let height = image.height;

            file.width = width;

            file.height = height;

            _this.imgList.push({

              file

            });

            if (_this.imgList.length == 3) {

              _this.show = false;

            }

            console.log(_this.imgList);

          };

          image.src = file.src;

        };

      }

    },

    delImg(index) {

      this.size = this.size - this.imgList[index].file.size; //总大小

      this.imgList.splice(index, 1);

      if (this.limit !== undefined) this.limit = 6 - this.imgList.length;

      if (this.imgList.length >= 3) {

        this.show = false;

      } else {

        this.show = true;

      }

    },

    displayImg() {},

    submit() {

      const self = this;

      let urls=[];

      if (self.imgList.length > 0) {

        for (let i = 0; i < self.imgList.length; i++) {

        self.uploadFile(self.imgList[i].file).then(res=>{

          urls.push(res);

        });

        }

        ..........

        ...........

        }).then(res => {

          if (res.code === 200) {

            this.success();

          } else {

            this.$toast(res.message);

          }

        });

      } else {

        this.$toast("请先添加图片");

      }

    },

    success() {

      this.$toast("提交成功");

      this.to("/allorder?type=5");

    },

    uploadFile(file) {

//xxxxxxx后端获取签名的接口

      this.$get("xxxxxxx").then(res => {

        debugger;

        console.log(res);

        let newFilename =

          Math.round(new Date().getTime() / 1000) +

          Math.ceil(Math.random() * 100000).toString() +

          file.name;

        var ossData = new FormData();

        ossData.append("OSSAccessKeyId", res.data.accessid);

        ossData.append("policy", res.data.policy);

        ossData.append("Signature", res.data.signature);

        //上传阿里云需要一个动态的random

        ossData.append("key", res.data.dir + newFilename);

        ossData.append("success_action_status", 200); // 指定返回的状态码

        ossData.append("file", file,file.name);

        axios.post(res.data.host, ossData, {

          headers: {

            "Content-Type": "multipart/form-data"

          }

        })

          .then(ret => {

            console.log(res.data.host+'/'+res.data.dir + newFilename);

            return res.data.host+'/'+res.data.dir + newFilename;

          })

          .catch(err => {

            console.log(err);

          });

      });

    }

  },

  created() {

      this.payEvidence = this.q.payEvidence;

    if (this.payEvidence != "") {

      this.payEvidence.split(";").forEach(item => {

        if (item != "") {

          this.imgList.push({ file: { src: item } });

        }

      });

    }

  }

});

</script>


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容