我在使用 PutObjectCommand 和 @aws-sdk/lib-storage 使用 @aws-sdk/client-s3 库将文件上传到 S3 存储桶时遇到问题上传超过 70kbps 的文件或多或少会返回错误:
`TypeError: Failed to fetch
at FetchHttpHandler.handle (fetch-http-handler.js:56:13)
at PutObjectCommand.js:56:58
at flexibleChecksumsResponseMiddleware.js:17:26
at deserializerMiddleware.js:2:32
at check-content-length-header.js:18:16
at awsAuthMiddleware.js:10:26
at async retryMiddleware.js:24:46
at async flexibleChecksumsMiddleware.js:54:20
at async loggerMiddleware.js:3:26
at async Promise.all (index 0)
upload.ts:31`
但是低于该值的文件通常会
用于上传文件的函数
` 从“@aws-sdk/client-s3”导入 { PutObjectCommand, S3Client }; 从“@aws-sdk/lib-storage”导入{上传}; 从“@smithy/fetch-http-handler”导入{FetchHttpHandler};
const secretAccessKey = import.meta.env.VITE_AWS_SECRET_ACCESS_KEY;
const accessKeyId = import.meta.env.VITE_AWS_ACCESS_KEY_ID;
const region = import.meta.env.VITE_AWS_DEFAULT_REGION;
const bucket = import.meta.env.VITE_BUCKET_NAME;
const client = new S3Client({
credentials: { secretAccessKey, accessKeyId },
region,
requestHandler: new FetchHttpHandler({
requestTimeout: 5000
})
});
export const onUploadFiles = async (file: any) => {
const upload = new Upload({
client,
params: {
Bucket: bucket,
Key: file.name,
Body: file.file,
ACL: "public-read"
},
partSize: 5 * 1024 * 1024
});
try {
upload.on("httpUploadProgress", (progress) => {
console.log(progress);
});
await upload.done();
} catch (error) {
console.log(error);
}
};
export const onUpload = async (file: any, callback: (data: any) => void) => {
const input = {
Bucket: bucket,
Key: file.name,
Body: file.file,
ACL: "public-read"
};
try {
const response = await client.send(new PutObjectCommand(input));
callback(response);
} catch (error) {
console.log(error);
}
};`
在上传对象时尝试使用这些参数上传: 存储桶、密钥、ACL、正文、内容长度、内容类型
这里同样的问题。我发现有一个bug: https://github.com/aws/aws-sdk-js-v3/pull/5319
对于小于一兆的文件,它可以工作。 还没想好如何解决
我今天也遇到了同样的问题。尝试使用
client-s3
和 PutObjectCommand
上传任何文件(无论其大小)会导致 "TypeError: Failed to fetch"
消息。对我有帮助的是将 aws-sdk/client-s3
软件包降级到 3.317.0
版本:
npm 删除 --purge @aws-sdk/client-s3
npm 我@aws-sdk/[电子邮件受保护]
之后,上传到S3又可以了。我希望这可以帮助任何面临类似问题的人。