如何使用预签名URL限制上传到AWS S3服务的文件大小

33
我正在使用AWS S3预签名URL从客户端(移动应用程序)上传图片。 我想防止用户上传大文件。 有没有办法限制上传的文件大小? 谢谢。
2个回答

16
请查看s3策略中的"content-length-range"。有关详细信息,请参见http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-HTTPPOSTConstructPolicy.html。在POST策略中,条件是一个对象数组,用于验证所上传对象的内容。您可以使用这些条件来限制请求中允许出现的内容。表格中指定的每个表单字段(除了x-amz-signature、文件、策略和具有x-ignore-前缀的字段名称)都必须出现在条件列表中。content-length-range是一个支持内容长度范围匹配类型的条件,用于指定上传内容的最小和最大允许大小。

5
在创建预签名 URL 以上传对象时,有没有一种方法可以做到这一点? - Niks
谢谢@Nat,我已经探索了“GeneratePresignedUrlRequest”API,但它没有提供指定“content-length-range”的方法。 - Niks
4
我知道可以通过浏览器上传或PUT对象API设置策略,但我找不到通过API生成预签名URL的设置策略方法(我正在使用Java SDK,GeneratePresignedUrl类没有这样的方法)。你有这方面的示例代码吗? - Niks
2
@NikhilPatil 这个能帮到你吗?https://github.com/minio/minio-java/blob/master/examples/PresignedPostPolicy.java 这是minio-java客户端库的PresignedPostPolicy.java示例,它与AWS S3 API兼容。声明:我在minio工作。 - koolhead17
2
@Niks 我尝试了这个教程 https://advancedweb.hu/how-to-use-s3-post-signed-urls/,它有效。 - Javier Solis Guzman
显示剩余2条评论

1

我已经完美地解决了这个问题!虽然POST策略可以工作,但使用预签名URL更加舒适。

我使用nodejs作为后端,并使用getSignedUrl来限制上传文件的大小。

只需要修改aws-sdk代码的三行即可。我已经尝试过,它可以很好地工作。

我不知道为什么nodejs的aws-sdk不支持它。如果有原因,请与我分享。

首先,打开“node_modules/aws-sdk/lib/signers/v4.js”,注释以下两行 enter image description here

其次,打开“node_modules/aws-sdk/lib/services/s3.js”,注释以下一行 enter image description here

第三步,编写代码生成预签名 URL 并上传文件 输入图像描述 输入图像描述


5
不幸的是,即使这样做可以起作用,在几乎所有情况下,注释掉依赖项中的代码都是一个糟糕的选择。除非您检查依赖项,否则更改不会传播。与您合作的任何其他开发人员都不会意识到这种特殊更改,并且很可能尝试更新该依赖项。此外,这似乎需要知道确切的大小,而不仅仅是添加限制。 - Adam A
是的,这只是一个 hack 使用,而且可以通过在向后端发出请求时加入标志来实现使用限制。 - coffeeking

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接