0

我正在使用generate_presigned_post()函数来使用 lambda 生成一个预签名的 url,如下所示:

response= s3_client.generate_presigned_post(
        Bucket = bucket_name,
        Key = key,
        ExpiresIn = 30
      )

响应格式为:

{
  "signed_url": {
    "url": "xxx",
    "fields": {
      "key": "xxx",
      "x-amz-algorithm": "xxx",
      "x-amz-credential": "xxx",
      "x-amz-date": "xxx",
      "x-amz-security-token": "xxx",
      "x-amz-signature": "xxx"
    }
  }
}

在客户端,我使用以下代码上传图像:

 function uploadToS3(data){
    var form = new FormData();
    var url  = JSON.parse(data["signed_url"])["url"]
    var fields = JSON.parse(data["signed_url"])["fields"]

    var presigned_url = url + fields.key + "?" +
    "X-Amz-Algorithm=" + fields["x-amz-algorithm"] +
    "&X-Amz-Credential=" + fields["x-amz-credential"] +
    "&X-Amz-Date=" + fields["x-amz-date"] +
    "&X-Amz-Expires=30"+
    "&X-Amz-SignedHeaders=host"+
    "&X-Amz-Security-Token=" + encodeURIComponent(fields["x-amz-security-token"]) +
    // "&policy="+ fields["policy"]
    "&X-Amz-Signature=" + fields["x-amz-signature"];


    form.append("file", $('#customFile1').get()[0].files[0], data['signed_url']['fields']['key']);

    // for (var pair of form.entries()) {
    // console.log(pair[0]+ ', ' + pair[1]); 
    // }
    $.ajax({
        type : 'POST',
        url: presigned_url,
        data: form,
        // timeout:0,
        processData:false,
        // mimeType: "multipart/form-data",
        contentType: false,
        success:function(resp){
            console.log(resp)
        },
        fail:function(resp){
            console.log(resp)
        },
        error:function(resp) {
            console.log(resp);
    }
    })
    }

我收到此错误,我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法。

4

1 回答 1

0

尝试以下操作:

function uploadToS3(data){
    var form = new FormData();
    var url  = JSON.parse(data["signed_url"])["url"]
    var fields = JSON.parse(data["signed_url"])["fields"]

    for (const k in fields) {
      const v = fields[k];
      formData.set(k, v);
    }

    formData.set("file", $('#customFile1').get()[0].files[0]);

    $.ajax({
        type : 'POST',
        url: url,
        data: form,
        // timeout:0,
        processData:false,
        mimeType: "multipart/form-data",
        contentType: false,
        success:function(resp){
            console.log(resp)
        },
        fail:function(resp){
            console.log(resp)
        },
        error:function(resp) {
            console.log(resp);
    }
    })
    }
于 2021-03-08T03:00:38.597 回答