通过静态S3网站结合Lambda与API Gateway上传文件时返回POST 400 bad request
S3静态页结合API Gateway、Lambda实现文件上传返回POST 400错误解决步骤
- 优先核对入参字段名匹配问题
你上传逻辑的POST请求里传的字段是FileName,大部分同场景实现里Lambda侧要求的上传对象字段名和下载逻辑保持一致,用的是ObjectName,字段名不匹配会直接触发API网关或Lambda的入参校验规则,返回400错误。可以先修改上传请求的参数,将FileName替换为ObjectName测试。 - 清理JSON序列化的无效尾逗号
你的两段JSON.stringify的入参对象里,最后一个键值对末尾都多了多余的逗号,部分严格的JSON解析器会将带尾逗号的序列化结果判定为无效格式,直接返回400。需要删掉两个请求参数里最后一个属性后的逗号。 - 核对API网关CORS配置
确认API Gateway的prod阶段已经开启CORS配置,允许来自你的S3静态页域名的POST请求,同时允许Content-Type请求头,跨域规则配置错误也会触发400报错。 - 校验入参合法性与权限
确认你页面输入的BucketName是Lambda角色有权限操作的桶名,没有拼写错误、多余空格;同时确认下拉框选中的methodType值为putObject,如果传了不支持的操作类型,Lambda无对应处理逻辑也会返回400。
修正后的代码片段参考
/* GET对象按钮触发的函数 图片会自动加载到底部div,普通文件会显示空图标(可后续优化) */ $(document).ready(function() { $("#UrlSignerBtnId").click(function() { $.ajax({ url: 'https://ze451btvv2.execute-api.eu-west-2.amazonaws.com/prod', type: 'POST', contentType: "application/json; charset=utf-8", data: JSON.stringify({ "BucketName": $('#BucketNameId').val(), "ObjectName": $('#ObjectNameId').val(), "methodType": $('#methodTypeId option:selected').attr('value') }), dataType: "json", //beforeSend: function(){ $( '#loader' ).show();}, success: function(res) { $("#urlTextId").html("你的<a href=" + res.PreSignedUrl + ">预签名URL</a>将在" + res.ExpiresIn +"秒后过期"); $("#SignedUrlId").html("<img src='" + res.PreSignedUrl + "'>"); $("#div-obj-holderId").show(); }, error: function(e) { $("#urlTextId").html("无法获取对象,请检查对象键名是否正确"); $("#SignedUrlId").html("<i>"+ e.responseText + "</i>"); $("#div-obj-holderId").show(); }, // complete: function() { $('#loader').hide(); } }); }); }); /* 上传对象按钮触发的函数 获取预签名上传URL后触发上传逻辑 */ $(document).ready(function() { $("#ObjectUploadBtnId").click(function() { $.ajax({ url: 'https://ze451btvv2.execute-api.eu-west-2.amazonaws.com/prod', type: 'POST', contentType: "application/json; charset=utf-8", data: JSON.stringify({ "BucketName": $('#BucketNameId').val(), "methodType": $('#methodTypeId option:selected').attr('value'), "ObjectName": $('#FileNameId').val() }), dataType: "json", //beforeSend: function(){ $( '#loader' ).show();}, success: function(res) { uploadFile(res, res.url); }, error: function(e) { $("#urlTextId").html("获取预签名上传URL失败:" + e.responseText); $("#SignedUrlId").html(""); $("#div-obj-holderId").show(); }, complete: function() { $('#loader').hide(); } }); }); });
内容的提问来源于stack exchange,提问作者Bemz
相关产品推荐
相关产品推荐

