如何将Canvas文件转换为图片并异步上传到服务器


开发过程中,遇到一个问题,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) => {
        },
      });
    }


声明:BenBonBen博客|版权所有,违者必究|如未注明,均为原创

转载:转载请注明原文链接 - 如何将Canvas文件转换为图片并异步上传到服务器


过去太迟,未来太远,当下最好