在预先指定的url上强制s3内容类型



我使用createPresignedPost让用户上传媒体到我的服务器,当它被上传s3调度事件到我的处理器lambda,但问题是我不能验证文件的内容类型。如果我没有提供

['starts-with', '$Content-Type', `image/`]

到我的createPresignedPost函数,系统自动分配binary/octet-stream内容类型对象,这是一个问题,因为我不能匹配它与我允许的内容类型(说jpg, png和jpeg)。

但是如果我添加条件,用户可以在提交具有不同内容类型的文件时,在头中手动发送允许的内容类型,假设他们写了Content-Type: image/png,但实际上发送了可执行文件,即使在处理器lambda中我也无法验证,因为当我在s3上为文件执行getObjectheadObject命令时,它返回在表单中提交的内容类型(image/png),即使实际的内容类型不同。

我很确定必须有某种解决方案来实际知道文件类型是什么,而不依赖于用户给你有效的信息。有什么我没看到的吗?

我也遇到过你想要解决的问题。

问题是文件的内容和它的content-type元数据之间没有关系。

重要的是要理解content-type头是HTTP标准的一部分。它被设计成允许服务器向客户机提供有关内容类型的信息。当客户端请求对象时,S3实现使用对象元数据发送此信息。

在非s3实现中,服务器完全控制内容。在这种情况下,它评估内容并根据其逻辑发送信息类型。

S3没有此功能。它接受对象content-type元数据中的任何类型的内容和任何值。当有人请求该联系人时,它将收到最初通知的content-type

来解决这个问题,你需要接收的内容,验证它,把正确的类型,并将它直接上传到S3。正如你在评论中提到的,放弃url对你没有帮助。

最新更新