AWS S3 POST 策略内容长度范围不适用于完全匹配的文件大小



我想为我们签名的url添加文件大小验证,确保客户端上传的文件恰好是就是我签名时用的尺寸。但是,当我这样做时:

"conditions": [
{"acl": "public-read"},
.... ,
["content-length-range", 1024, 1024]
]

对于小文件,它可以工作。
但是稍微大一点的文件,例如25mb,它会导致EntityTooSmall错误。

只有当我像这样将最小值设置为0时,它才会开始工作:

["content-length-range", 0, 1024]

但是我想强制一个特定的文件大小,而不是一个范围。
S3不支持精确文件大小匹配?

编辑:以下是我用Python编译的完整代码:

# Create an S3 client
s3 = boto3.client(
's3',
aws_access_key_id="...",
aws_secret_access_key="...",
region_name="sfo3",
endpoint_url="https://sfo3.digitaloceanspaces.com",
)
# Specify the bucket name
bucket_name = 'my_bucket'
# Specify the file name
file_name = 'SampleJPGImage_30mbmb.jpeg'
# Get the file size in bytes
file_size = os.path.getsize(file_name)
# Use the file size and content
print("File size:", file_size, "bytes") # Should be 30789588
# Specify the desired file size in bytes
file_size_min = file_size
file_size_max = file_size
# Sign the policy with your AWS secret key
signedPolicy = s3.generate_presigned_post(
Bucket=bucket_name,
Key=file_name,
Fields={
"acl": "public-read",
"key": file_name,
},
Conditions=[
{"acl": "public-read"},
{"key": file_name},
["content-length-range", file_size_min, file_size_max]
],
ExpiresIn=3600
)
# Use the signed policy to upload the file
with open(file_name, 'rb') as f:
print()
resp = requests.post(signedPolicy['url'], data=signedPolicy['fields'], files={'file': f})
print(resp)
print(resp.content)

我设法用Postman测试了一个确切的文件大小,一切都正常工作。我使用的条件是:

const Conditions = [
["content-length-range", 30789588, 30789588],
["eq", "$Content-Type", "image/jpeg"]
];

我从这里下载了30MB的文件:https://sample-videos.com/download-sample-jpg-image.php

当我将内容长度的大小更改为30789587时,我得到以下内容:

<Error>
<Code>EntityTooLarge</Code>
<Message>Your proposed upload exceeds the maximum allowed size</Message>
<ProposedSize>30789588</ProposedSize>
<MaxSizeAllowed>30789587</MaxSizeAllowed>
</Error> 

内容长度为30789589:

<Error>
<Code>EntityTooSmall</Code>
<Message>Your proposed upload is smaller than the minimum allowed size</Message>
<ProposedSize>30789588</ProposedSize>
<MinSizeAllowed>30789589</MinSizeAllowed>
</Error> 

测试我使用的相同文件,让我们看看它是否适用于你。

编辑

对DigitalOcean Spaces执行Python代码会给出相同的错误:EntityTooSmall没有任何其他信息

对AWS S3执行相同的代码工作正常。此外,当我更改范围时,错误消息更有用。

似乎在DigitalOcean Spaces中没有正确实现范围

遗憾的是,没有。您只能指定一个范围。我会检查文件大小限制是否指定正确。此错误可能表明计算不正确。

为了进一步测试它,我建议使用例如dd工具生成一个精确大小的文件,如下所示

dd if=/dev/zero of=test-file-1 bs=26214400 count=1

然后尝试上传它。在本例中,您的范围必须为[26214400,26214400]。

最新更新