开发时遇到一个需求,选择图片截图 上传至OSS服务器。 一般情况下我们上传文件会选择jq的 uplaod() 来上传文件
但是现在的需求 先截图,截下来的 图是 canvas对象,要先转为base64,在转为blob上传至 oss文件服务器,代码如下
// 转blob方法
function convertBase64UrlToBlob(urlData) {
let bytes = window.atob(urlData.split(',')[1]); //去掉url的头,并转换为byte
//处理异常,将ascii码小于0的转换为大于0
let ab = new ArrayBuffer(bytes.length);
let ia = new Uint8Array(ab);
for (let i = 0; i < bytes.length; i++) {
ia[i] = bytes.charCodeAt(i);
}
return new Blob([ab],{ "type": "image/jpeg", "filename": "upload.jpg" });
}
// 讲定result 是我们截图下来的canvas对象
let date = result.toDataURL('image/jpeg') //转为base64
// 上传oss服务器 //
const uploadOss = (option,base64Codes="") => { // 注意下面的 append参数的顺序不要乱写,这样oss服务器会报错的
return new Promise((resolve, reject) => {
let formData = new FormData(document.forms[0]); //这里连带form里的其他参数也一起提交了,如果不需要提交其他参数可以直接FormData无参数的构造函数
//convertBase64UrlToBlob函数是将base64编码转换为Blob
formData.append('key', option.key);
formData.append('policy', option.policy);
formData.append('OSSAccessKeyId', option.OSSAccessKeyId);
formData.append('success_action_status', option.success_action_status);if(option.callback) formData.append("callback", option.callback);
if(option.verify) formData.append("x:verify", option.verify);
formData.append('signature', option.signature);
formData.append("file", convertBase64UrlToBlob(base64Codes)); //append函数的第一个参数是后台获取数据的参数名,和html标签的input的name属性功能相同 let xmlHttpReq = null;
//IE浏览器使用ActiveX
if (window.ActiveXObject) {
xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
}
//其它浏览器使用window的子对象XMLHttpRequest
else if (window.XMLHttpRequest) {
xmlHttpReq = new XMLHttpRequest();
}
if (xmlHttpReq !== null) {
//设置回调,当请求的状态发生变化时,就会被调用
xmlHttpReq.onreadystatechange = () => {
//等待上传结果
// if (xmlHttpReq.readyState == 1) {
// }
// 上传成功,返回的文件名,设置到div的背景中
if (xmlHttpReq.readyState === 4 && xmlHttpReq.status === 200) {
let data = {};
try {
data.code = 200;
// data = JSON.parse(xmlHttpReq.responseText);
if(xmlHttpReq.statusText == 'OK') {
resolve(data);
}
// if(data.code ===200){
// resolve(data.data);
// }
} catch (e) {
reject({code:407,data:"数据类型出错"});
}
}
};
//设置请求(没有真正打开),true:表示异步
xmlHttpReq.open("POST",url, true);
//不要缓存
//xmlHttpReq.setRequestHeader("If-Modified-Since", "0");
//提交请求
xmlHttpReq.send(formData);
//清除掉,否则下一次选择同样的文件就进入不到onchange函数中了
}}
// 上传文件 至普通服务器
export const fileUpload = (url="",base64Codes="")=>{
return new Promise((resolve, reject) => {
let formData = new FormData(document.forms[0]); //这里连带form里的其他参数也一起提交了,如果不需要提交其他参数可以直接FormData无参数的构造函数
//convertBase64UrlToBlob函数是将base64编码转换为Blob
formData.append("file", convertBase64UrlToBlob(base64Codes)); //append函数的第一个参数是后台获取数据的参数名,和html标签的input的name属性功能相同
let xmlHttpReq = null;
//IE浏览器使用ActiveX
if (window.ActiveXObject) {
xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
}
//其它浏览器使用window的子对象XMLHttpRequest
else if (window.XMLHttpRequest) {
xmlHttpReq = new XMLHttpRequest();
}
if (xmlHttpReq !== null) {
//设置回调,当请求的状态发生变化时,就会被调用
xmlHttpReq.onreadystatechange = () => {
//等待上传结果
// if (xmlHttpReq.readyState == 1) {
// filenode.parentNode.style.backgroundImage = "url('/images/bigloader.gif')";
// }
// 上传成功,返回的文件名,设置到div的背景中
if (xmlHttpReq.readyState === 4 && xmlHttpReq.status === 200) {
let data = {};
try {
data = JSON.parse(xmlHttpReq.responseText);
if(data.code ===200){
resolve(data.data);
}
} catch (e) {
reject({code:407,data:"数据类型出错"});
}
}
};
//设置请求(没有真正打开),true:表示异步
xmlHttpReq.open("POST", url , true);
//不要缓存
//xmlHttpReq.setRequestHeader("If-Modified-Since", "0");
//提交请求
xmlHttpReq.send(formData);
//清除掉,否则下一次选择同样的文件就进入不到onchange函数中了
}
});
};