为Amazon S3生成具有最大内容长度的预签名PUT URL

D. *_*nes 5 java put amazon-s3 amazon-web-services pre-signed-url

我正在尝试生成客户端可以用来将图像上传到特定S3存储桶的预签名URL。我已经成功生成了对GET文件的请求,如下所示:

GeneratePresignedUrlRequest urlRequest = new GeneratePresignedUrlRequest(bucket, filename);
urlRequest.setMethod(method);
urlRequest.setExpiration(expiration);
Run Code Online (Sandbox Code Playgroud)

其中expiration和method分别是Date和HttpMethod对象。

现在,我试图创建一个URL,以允许用户放置文件,但是我不知道如何设置最大内容长度。我确实找到了有关POST政策的信息,但是我更喜欢在这里使用PUT-我也想避免构造JSON,尽管这似乎不太可能。

最后,一个替代的答案可能是将图像上传从API网关传递到Lambda的某种方法,因此我可以在验证文件类型和大小后将其从Lambda上传到S3(这不理想)。

D. *_*nes 0

虽然我没有设法限制上传的文件大小,但我最终创建了一个 Lambda 函数,该函数在上传到临时存储桶时被激活。该函数具有如下所示的签名

public static void checkUpload(S3EventNotification event) {
Run Code Online (Sandbox Code Playgroud)

(这一点值得注意,因为我在网上找到的所有指南都引用了似乎不再存在的 S3Event 类)

该函数提取文件的元数据(不是文件本身,因为这可能被视为大型下载)并检查文件大小。如果可接受,它会下载该文件,然后将其上传到目标存储桶。如果没有,它只会删除该文件。

这远非理想,因为不符合标准的上传似乎可以工作,但随后根本不会出现(因为 S3 将在上传时发出 200 状态代码,而不关心 Lambda 的响应是什么)。

这实际上是一种解决方法,而不是解决方案,所以我不会接受这个答案。