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

Wix平台使用S3预签名POST URL上传文件失败求助

AWS S3预签名POST URL上传异常:仅上传15B文本内容(Wix平台JS实现)

问题背景

在Wix平台通过AWS S3无条件预签名POST URL上传图片时,JS请求返回成功,但S3中仅生成15B的文本文件(预期为完整图片)。尝试添加Content-Type作为请求头或FormData字段时,触发Bad Request或Forbidden错误。本地Python上传逻辑可正常运行。

上传代码

async function uploadFile(file) {
    let presignedData = await fetchPresignedData()
    console.log(presignedData)
    let formData = new FormData();
    
    Object.entries(presignedData.fields).forEach(([key, value]) => {
        formData.append(key, value);
    });
    formData.append('file', file); // file是包含name、size等属性的File对象

    formData.forEach((value, key) => {
        console.log(`${key}: ${value}`);
    });

    // 执行文件上传
    await fetch(presignedData.url, {
            method: 'POST',
            body: formData,
    })
};

解决方案

  • 严格匹配预签名的Content-Type规则
    预签名POST的fields如果包含Content-Type字段,必须和上传文件的实际类型完全一致,禁止手动修改或添加额外的Content-Type。如果预签名生成时未指定Content-Type,不要在FormData或请求头中添加该字段。

  • 修正FormData文件追加逻辑
    确保文件以二进制形式追加到FormData,可显式指定文件名(避免Wix平台自动转换格式):

    // 仅当预签名允许时,才添加第三个参数指定文件名
    formData.append('file', file, file.name);
    
  • 规避Wix的请求自动处理
    Wix可能会修改fetch请求的默认行为,添加以下配置避免干扰:

    await fetch(presignedData.url, {
        method: 'POST',
        body: formData,
        credentials: 'omit', // 禁止传递不必要的凭证
        headers: {} // 清空自定义头,让浏览器自动生成multipart/form-data边界
    });
    
  • 对比Python与JS的请求差异
    用Chrome DevTools抓包对比两者的请求细节:

    • 检查请求头中Content-Type的边界值是否正常
    • 查看请求体中文件部分是否为二进制传输
      重点确认Python请求中Content-Disposition的格式,确保JS请求与之对齐。
  • 检查预签名的权限与条件
    确认预签名POST的生成逻辑未添加隐藏限制(如文件大小、Content-Type白名单),JS上传必须严格符合这些条件,否则S3可能返回200但仅写入错误提示文本(即你看到的15B文件)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 01:50:07