首页 > 解决方案 > 使用来自 .net 核心 API 的预签名 url 将多部分数据从 Javascript 上传到 S3 时出错

问题描述

我正在使用 .NET(API/后端)中的以下代码生成预签名 URL。

var preSignedUrlRequest = new GetPreSignedUrlRequest
{
    BucketName = bucketName,
    Key = keyName,
    UploadId = data.UploadID,
    PartNumber = data.PartNumber,
    Expires = DateTime.Now.AddMinutes(1440),
    //Protocol = (Protocol.HTTPS),
    Verb = HttpVerb.PUT
    //ContentType = data.ContentType,

};
var url = s3Client.GetPreSignedURL(preSignedUrlRequest);

并发送回前端(在http://127.0.0.1:5500/index.html运行的 Javascript 文件)将文件字节直接上传到 S3。

for (let index = 1; index < NUM_CHUNKS + 1; index++) {
    start = (index - 1) * FILE_CHUNK_SIZE
    end = (index) * FILE_CHUNK_SIZE
    blob = (index < NUM_CHUNKS) ? state.selectedFile.slice(start, end) : state.selectedFile.slice(start)

    const sData = {
            fileName: state.fileName,
            partNumber: index,
            uploadID: state.uploadId,
            contentType: 'application/x-www-form-urlencoded; charset=UTF-8'
        }
    let res = await axios.post(`${state.backendUrl}/FileUpload/GetUrlForEachPart`, sData);
    let presignedUrl = res.data;
    if(!presignedUrl) return;

    let uploadResp = axios.put(
        presignedUrl,
        blob
         , { headers: { 'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8'}}
    );
    promisesArray.push(uploadResp)
}

但得到以下错误:

<Error>
   <Code>SignatureDoesNotMatch</Code>
   <Message>
    The request signature we calculated does not match the signature you provided. Check your key and signing method.
   </Message>
   <AWSAccessKeyId>
  SomeKey
   </AWSAccessKeyId>
   <StringToSign>
      PUT
      application/x-www-form-urlencoded;charset=utf-8
      1619642107
      /bucketname/profile_pictures/563131de-1359-4efb-b971-ad64ffffb424.jpg?partNumber=1&uploadId=fz8XMvcY7PRLLTq5TnF22oMEblJxq9cAgx8NnogKlU86W11DNeIVlvceWUICtTKAuUBafdY9UiguWHCDAEqKLFay6Mz8_DfFBaFCITfJdo3ronBL92xPHA9js02JY54v
    </StringToSign>
    <SignatureProvided>
      xEKWu7sASAVBvdT0fXtN+fMCg3k=
    </SignatureProvided>
    <StringToSignBytes>
      50 55 54 0a 43 6f 6e 74 65 6e 74 4d 44 35 0a 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 77 77 77 2d 66 6f 
     </StringToSignBytes>
     <RequestId>AAKH5YH55KGG7ME4</RequestId>
     <HostId>8FbaBlqRefB1BWdqDkOvZbWijFr6RTUvO8olEiEkNnytXbA01FECI2bplM=</HostId>
</Error>

我正在尝试从昨天开始修复它并尝试许多 stackoverflow 解决方案。但没有运气。

如果有人弄清楚我的错误,那将是一个很大的帮助。谢谢

注意:我的凭据没有用。我可以从后端上传文件字节而无需预先签名的 url。

标签: javascriptasp.net-coreamazon-s3axios

解决方案


推荐阅读