开发过程中,遇到一个问题,canvas 处理了海报,需要默认直接上传到服务器,获取服务器放回的地址。
canvas 处理过的海报地址,其实是个base64字符串,需要将此地址转化成文件,才能上传至服务器。
//制作海报
function makePoster() {
const canvas = document.getElementById("posterCanvas");
const context = canvas.getContext("2d");
// ... 绘制海报的代码 ...
const posterImage = canvas.toDataURL("image/png");
dataURLtoFile(posterImage, "signature.png");
}dataURLtoFile方法,将Base64字符串转成文件
/**
* 将base64转换为文件
* {string} dataurl 为base64字符串
* {string} filename 为文件名(必须带后缀名,如.jpg,.png)
*/
function dataURLtoFile(dataurl, filename) {
var arr = dataurl.split(","), //使用 split() 方法将 Data URL 字符串分成两部分,即 MIME 类型和数据部分,并将它们存储在数组 arr 中
mime = arr[0].match(/:(.*?);/)[1], //使用正则表达式和 match() 方法从 MIME 类型部分中提取实际的 MIME 类型
bstr = atob(arr[1]), //使用 atob() 方法将数据部分的 base64 编码解码为二进制字符串。
n = bstr.length,
u8arr = new Uint8Array(n); //创建一个长度为解码后字符串长度的 Uint8Array 数组 u8arr
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}//使用循环将解码后的二进制字符串转换为 Uint8Array
this.fileList = new File([u8arr], filename, { type: mime }); //使用 File 构造函数创建一个 File 对象,传入转换后的 Uint8Array、文件名和 MIME 类型作为参数
uploadPoster(this.fileList); //调用 uploadPoster 函数,并将转换后的 File 对象作为参数进行图片上传
}异步上传。
// 异步上传标题图
function uploadPoster(poster) {
formData = new FormData();
formData.append("file", poster);
$.ajax({
url: "/resource/upload/images",
type: "POST",
data: formData,
processData: false, // 告诉jQuery不要去处理发送的数据
contentType: false, // 告诉jQuery不要去设置Content-Type请求头
success: (result) => {
},
});
}



