使用S3预签名URL POST方法上传超5GB文件时遇EntityTooLarge错误的求助(需支持动态设置文件名)
S3预签名URL POST方法上传超5GB文件时遇EntityTooLarge错误的求助(需支持动态设置文件名)
大家好,我最近在处理S3预签名URL上传的问题,卡在这里了想请教下各位:
我原本想用POST预签名URL来实现上传,主要是为了能动态设置S3对象key里的文件名,代码如下:
const prefix = `${this._id}/`; const keyName = `${prefix}\${filename}`; // 用${filename}来动态指定S3 bucket里的文件名 const expiration = durationSeconds; const params = { Bucket: bucketName, Key: keyName, Fields: { acl: 'private' }, Conditions: [ ['content-length-range', 0, 10 * 1024 * 1024 * 1024], // 我设置了0到10GB的文件大小限制 ['starts-with', '$key', this._id], ], Expires: expiration, };
但当我尝试上传7.9GB左右的文件时,直接收到了S3的报错,错误XML如下:
<?xml version="1.0" encoding="UTF-8"?> <Error> <Code>EntityTooLarge</Code> <Message>Your proposed upload exceeds the maximum allowed size</Message> <ProposedSize>7955562419</ProposedSize> <MaxSizeAllowed>5368730624</MaxSizeAllowed> <RequestId>W89BFHYMCVC4</RequestId> <HostId>0GZR1rRyTxZucAi9B3NFNZfromc201ScpWRmjS6zpEP0Q9R1LArmneez0BI8xKXPgpNgWbsg=</HostId> </Error>
我明明在Conditions里设了10GB的上限,但S3返回的最大允许大小却是5GB,这就很困惑。
另外,我试过用PUT方法的预签名URL上传大于等于5GB的文件,是可以成功的,但PUT方法有个致命问题——没办法动态设置key里的文件名。我试了下面的写法,但完全不生效:
const key = "path/${filename}"; // 这里的${filename}根本不会被动态替换 const command = new PutObjectCommand({ Bucket: bucketName, Key: key, ACL: 'private' }); const url = await getSignedUrl(s3, command, { expiresIn: 3600 });
所以现在陷入了两难:POST能动态设文件名但传不了5GB以上的文件,PUT能传大文件但没法动态设文件名。请问有没有什么办法解决这个矛盾?或者有没有其他方案能同时满足动态设置文件名和大文件上传的需求?
内容来源于stack exchange
相关产品推荐
相关产品推荐

