You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vanilla Javascript Canvas裁剪后AJAX上传图片请求负载为空

问题排查与解决方法

  1. 移除所有手动设置的Content-Type请求头

使用FormData上传文件时,浏览器会自动生成带boundary分隔符的multipart/form-data请求头,手动设置Content-Type会丢失boundary参数,导致浏览器无法正确序列化FormData、后端无法解析请求体。你测试的三种请求头设置全部是错误的,直接删掉所有xhr.setRequestHeader设置Content-Type的代码即可。

  1. 改为异步XHR请求

你当前使用的是同步XHR(xhr.open第三个参数为false),火狐浏览器对同步请求传输二进制/文件类型数据存在限制,是payload丢失的核心诱因之一。把xhr.open("POST", "AJAX.portal.php", false)改成xhr.open("POST", "AJAX.portal.php", true),同时在onreadystatechange回调中补充xhr.readyState === 4的判断,再处理返回结果。

  1. 修正File对象的创建逻辑

canvas.toDataURL返回的是base64格式的字符串,不是二进制数据,直接传入File构造函数会导致文件内容是base64文本而非图片二进制,需要先把base64转成Blob再创建File,示例代码如下:

// dataURL转Blob工具方法
function dataURLtoBlob(dataurl) {
    var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
        bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
    while(n--){
        u8arr[n] = bstr.charCodeAt(n);
    }
    return new Blob([u8arr], {type:mime});
}

// 替换原有File创建逻辑
const imgBlob = dataURLtoBlob(CroppedIMG);
const imgFile = new File([imgBlob], ImageName, {type: 'image/jpeg'});
formData.append('Images[]', imgFile, ImageName);
  1. 避免内置对象名冲突

你当前用Image作为变量名,和浏览器内置的Image构造函数重名,可能引发不可预知的问题,建议改成其他变量名比如imgFile。

内容的提问来源于stack exchange,提问作者BigNick Montana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 00:06:02