【js】vue项目内的图片转换为File的形式

前情提要

后端项目中已有一个接口,接收前端input[type=file]上传的图片文件。但前端需要添加一个重置功能,即将图片重置为默认图片,且不添加新接口。因此,想要利用此接口实现重置功能,即是将项目内的默认图片转换为file形式,便可使用此接口进行上传。

主要实现

主要步骤为:图片 —> base64 —> Blob —> File。

1)图片转base64

其中,$.Deferred是使用了JQuery的方法。

// 实现将项目的图片转化成base64
function getBase64(img) { // 传入图片路径,返回base64
  let picImage = new Image();
  let deferred = $.Deferred();
  if (img) {
    picImage.onload = function () {
      deferred.resolve(getBase64Image(picImage)); // 将base64传给done上传处理
    };
    picImage.src = img;
    return deferred.promise(); // 要让onload完成后再return sessionStorage['imgTest']
  }
}
// 转换为base4的主要方法
function getBase64Image(img, width, height) {
  let canvas = document.createElement('canvas');
  canvas.width = width || img.width;
  canvas.height = height || img.height;
  let ctx = canvas.getContext('2d');
  ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
  let dataURL = canvas.toDataURL();
  return dataURL;
}

2)base64转Blob

function convertBase64ToBlob(base64) {
  var base64Arr = base64.split(',');
  var imgtype = '';
  var base64String = '';
  if (base64Arr.length > 1) {
    // 如果是图片base64,去掉头信息
    base64String = base64Arr[1];
    imgtype = base64Arr[0].substring(base64Arr[0].indexOf(':') + 1, base64Arr[0].indexOf(';'));
  }
  // 将base64解码,atob() 方法用于解码使用 base-64 编码的字符串。
  var bytes = atob(base64String);
  var bytesCode = new ArrayBuffer(bytes.length);
  // 转换为类型化数组
  var byteArray = new Uint8Array(bytesCode);
  // 将base64转换为ascii码
  for (var i = 0; i < bytes.length; i++) {
    byteArray[i] = bytes.charCodeAt(i);
  }
  // 生成Blob对象(文件对象)
  return new Blob([bytesCode], {type: imgtype});
};

3)重置功能:转File

let url = '../../../img/anonymous.png';
getBase64(url)
        .then((base64) => {
          this.picFile = new File([convertBase64ToBlob(base64)], 'anonymous.png');
          // 上传
        }, (err) => {
          console.log(err);
          this.$Message.error('出现错误');
        });

补充

一开始,我是将图片放在src里面,但一直读取不到,最后我是将图片放在public目录的img文件夹下。

你可能感兴趣的:(js)