0
点赞
收藏
分享

微信扫一扫

实现截图粘贴上传、拖拽上传

幸福的无所谓 2022-03-12 阅读 98

之前上传方式是使用element-ui的el-upload,现在需要添加一个需求功能实现截图粘贴也可以上传。

直接上代码:

<div>
    <div>附件</div>
            //为了第一次截屏,粘贴在对应组件上
          <div id="editable" contenteditable="true"></div>
          <el-upload
            ref="uploadFiles"
            v-if="configType != 2"
            style="width: 100%"
            class="upload-demo"
            drag
            :action="fileUrl + '/file/upload'"
            name="file_upload"
            :headers="{
              accessToken: token
            }"
            :on-success="uploadSuccess"
            :on-remove="removeFile"
            multiple
            :file-list="attachFileList"
          >
            <i class="el-icon-upload"></i>
            <div class="el-upload__text">
              将文件拖到此处,或
              <em>点击上传</em>
            </div>
            <div class="el-upload__tip">
              支持格式:rar、zip、doc、docx、pdf、png、jpg
            </div>
          </el-upload>
</div>

在methods中添加方法:

 // 监听截屏对应事件粘贴方法
    listenerPaste() {
      let _this = this;
      window.addEventListener("paste", function (event) {
        event.preventDefault();
        event.stopPropagation();
        // 为了截屏时,粘贴在当前的组件,第一次必须促发一次
        (function () {
          document.getElementById("editable").click();
        })();
        _this.paste_img(event);
      });
    },
    // 粘贴方法
    paste_img(e) {
      let _this = this;
      if (e.clipboardData.items) {
        let ele = e.clipboardData.items;
        for (var i = 0; i < ele.length; ++i) {
          if (ele[i].kind == "file" && ele[i].type.indexOf("image/") !== -1) {
            var fileObj = ele[i].getAsFile(); //获取图片信息

            window.URL = window.URL || window.webkitURL;
            var blobUrl = window.URL.createObjectURL(fileObj);
            fileObj.src = blobUrl;
            console.log(blobUrl);
            this.convertImgToBase64(blobUrl, function (base64Img) {
              let blobData = _this.dataURLtoBlob(base64Img);

              let formdata = new FormData(); // new一个formdata对象
              let _filename = new Date().getTime() + ".jpg"; // 修改文件名
              formdata.append("file_upload", blobData, _filename); // key值, 二进制类型文件,文件名

              // 使用axios
              uploadFile("/file/upload", formdata).then(res => {
                console.log("res", res, fileObj);
                // 格式化文件对象,与el-upload的uploadSuccess方法返回文件对象对应
                let fileCopy = {
                  ...fileObj,
                  response: JSON.parse(JSON.stringify(res)),
                  percentage: 100,
                  raw: fileObj,
                  status: "success",
                  name: fileObj.name,
                  size: fileObj.size,
                  type: fileObj.type
                };
                _this.uploadSuccess(res, fileCopy, [fileCopy]);
                window.removeEventListener("paste", _this.paste_img);
              });
            });
          }
        }
      } else {
        console.log("non-chrome");
      }
    },
    // base64Img
    convertImgToBase64(url, callback, outputFormat) {
      var canvas = document.createElement("CANVAS"),
        ctx = canvas.getContext("2d"),
        img = new Image();
      img.crossOrigin = "Anonymous";
      img.onload = function () {
        canvas.height = img.height;
        canvas.width = img.width;
        ctx.drawImage(img, 0, 0);
        var dataURL = canvas.toDataURL(outputFormat || "image/png");
        console.log("dataURL", dataURL);
        callback.call(this, dataURL);
        canvas = null;
      };
      img.src = url;
      console.log(" img.src", img.src);
    },

    //将base64转换为blob
    dataURLtoBlob(dataurl) {
      var arr = dataurl.split(","),
        mime = arr[0].match(/:(.*?);/)[1],
        bstr = atob(arr[1]),
        n = bstr.length,
        u8arr = new Uint8Array(n);
      while (n--) {
        u8arr[n] = bstr.charCodeAt(n);
      }
      return new Blob([u8arr], { type: mime });
    },

 

参考资料:

用HTML5 File API 实现截图粘贴上传、拖拽上传 - MrJaden - 博客园 (cnblogs.com)

(60条消息) JavaScript base64位文件转Blob类型,FormData上传二进制文件_1004-CSDN博客

举报

相关推荐

0 条评论