粘贴快速上传

借鉴了很多,也有很多小坑,在这里留个纪念  也希望可以帮助大家  有不对的多多指导

话不多说直接看代码:

<template>
  <div class="about">
    <div class="box">
      <div id="preview" class="upload-preview" v-on:paste="handlePaste">
      </div>
      <el-button v-on:click="uploadPlans" type="primary" style="margin-top:20px;">上传文件</el-button>
    </div>
  </div>
</template>
<script>
import axios from "axios";
export default {
  data() {
    return {};
  },
  methods: {
    handlePaste(event) {
      const items = (event.clipboardData || window.clipboardData).items;
      let file = null;

      if (!items || items.length === 0) {
        alert("当前浏览器不支持本地");
        return;
      }
      // 搜索剪切板items
      for (let i = 0; i < items.length; i++) {
        if (items[i].type.indexOf("image") !== -1) {
          file = items[i].getAsFile();
          break;
        }
      }
      if (!file) {
        alert("粘贴内容非图片");
        return;
      }
      // 此时file就是我们的剪切板中的图片对象
      // 如果需要预览,可以执行下面代码
      const reader = new FileReader();
      reader.onload = (event) => {
        preview.innerHTML = `<img src="${event.target.result}">`;
      };
      reader.readAsDataURL(file);
      this.file = file;
    },
    //上传文件成功后回调
    uploadPlans() {
      let file = this.file;
      if (!file) {
        alert("请粘贴图片后上传");
        return;
      }
      this.loading = true;
    //利用formata转为二进制  然后append来追加参数  此处参数需要和后端确定格式
      let form = new FormData();
      form.append("api", "file@upload");
      form.append("filename", file);
      //uploadCertificate是封装的axios请求,自己根据需求传参
      this.uploadCertificate(form)
        .then((data) => {
          console.log(data.code);
          if (data.code == 200) {
            alert("上传成功!");
          } else {
            alert("上传失败!");
          }
        })
        .catch(() => {});
    },
    uploadCertificate(formData) {
    //利用formData传入的二进制格式
      return new Promise((resolve, reject) => {
        axios({
          method: "POST",
          url: "上传路径",
          headers: {
            "Content-Type": "multipart/form-data",
            token: "自己的token",
          },
          data: formData,
        })
          .then((data) => {
            console.log(data);
            if ((data.data.code = 200)) {
              if (data.data) {
                resolve({
                  default:
                    "https://staticonline.superhub.com.cn/" +
                    data.data.data.img,
                  code: 200,
                });
              } else {
                reject(data.data.code);
              }
            }
          })
          .catch((e) => {
            console.log(e);
            reject();
          });
      });
    },
  },
};
</script>

<style lang="less" scoped>
.upload-preview {
  min-height: 150px;
  width: 400px;
  margin: auto;
  margin-top: 20px;
  image{
    width: 500px;
    height: 500px;
  }
}
.upload-preview:empty::before {
  border: 1px solid #ddd;
  content: "预览区";
  display: block;
  text-align: center;
  font-size: 40px;
  line-height: 150px;
  opacity: 0.6;
}
</style>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值