javascript - 使用来自 .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。
解决方案
推荐阅读
- c# - 如何在列表视图项上用鼠标右键单击添加上下文菜单?
- javascript - 如何在bing map api中动态添加用户的位置
- rust - Rust 交叉编译期间的 pkg-config 错误
- reactjs - ReactJs 没有在 useEffect 中读取 map 函数
- azure - 如何登录到 Azure 中的容器?
- scala - 播放框架 sbt docker:publishLocal 显示错误
- c - 为什么枚举作为 C 中的一种类型存在
- css - 如何将背景渐变向左移动位置
- ruby-on-rails - NoMethodError: AjaxDatatablesRails:Module 的未定义方法“配置”
- javascript - Canvas CaptureStream 的高 CPU 使用率