前情提要
后端项目中已有一个接口,接收前端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文件夹下。