我有一個(gè) lambda 來生成預(yù)簽名的上傳 URL。這是我用來獲取 URL 的代碼: urlExpiresAt := time.Duration(10) * time.Second s3Session := s3.New(awsSession) request, _ := s3Session.PutObjectRequest(&s3.PutObjectInput{ Bucket: aws.String(awssettings.FileStorageBucketName), Key: aws.String(fmt.Sprintf("%s/%s", *cognitoUser.Username, filename)), ContentType: aws.String(uploadContentType), }) uploadUrl, err := request.Presign(urlExpiresAt)在我的前端,我檢索該 URL 并立即嘗試向它發(fā)送上傳 POST 請求: try { const { data: { fileUploadUrl }, } = await graphQlClient.query({ query: gql(getFileUploadUrlQuery), variables: { filename, }, }); const formdata = new FormData(); formdata.append("file", file); const ajaxRequest = new XMLHttpRequest(); ajaxRequest.upload.addEventListener("progress", progressHandler, false); ajaxRequest.addEventListener("load", completeHandler, false); ajaxRequest.addEventListener("error", errorHandler, false); ajaxRequest.addEventListener("abort", abortHandler, false); ajaxRequest.open("POST", fileUploadUrl); ajaxRequest.send(formdata); } catch (err) { console.log(err); }出于測試目的,我將我的存儲(chǔ)桶配置為可公開訪問:{ "Version": "2012-10-17", "Statement": [ { "Sid": "UploadFiles", "Effect": "Allow", "Principal": "*", "Action": "s3:PutObject", "Resource": "<bucketARN>/*" } ]}用于測試目的的 CORS 配置如下:[ { "AllowedHeaders": [ "*" ], "AllowedMethods": [ "POST" ], "AllowedOrigins": [ "http://localhost:8080" ], "ExposeHeaders": [] }]CORS 飛行前請求返回狀態(tài)200,但是POST發(fā)送文件內(nèi)容的請求被拒絕403并出現(xiàn)以下錯(cuò)誤:<Error> <Code>AccessDenied</Code> <Message>Request has expired</Message> <X-Amz-Expires>5</X-Amz-Expires> <Expires>2022-09-07T04:14:50Z</Expires> <ServerTime>2022-09-13T06:40:18Z</ServerTime>...</Error>閱讀此錯(cuò)誤,看起來 URL 在預(yù)簽名之前已過期,這沒有意義。我在這里做錯(cuò)了什么?
1 回答

侃侃無極
TA貢獻(xiàn)2051條經(jīng)驗(yàn) 獲得超10個(gè)贊
我發(fā)現(xiàn)我的解決方案有兩個(gè)問題:
PUT首先,使用方法生成預(yù)簽名 URL ,而不是POST
其次,AWSAppSyncClient我使用 GraphQL 客戶端默認(rèn)緩存查詢結(jié)果,所以我需要的只是禁用緩存fetchPolicy: "network-only"
const {
data: { fileUploadUrl },
} = await graphQlClient.query({
query: gql(getFileUploadUrlQuery),
fetchPolicy: "network-only", // <- THIS LINE
variables: {
filename,
},
});
- 1 回答
- 0 關(guān)注
- 184 瀏覽
添加回答
舉報(bào)
0/150
提交
取消