我使用createPresignedPost
让用户上传媒体到我的服务器,当它被上传s3调度事件到我的处理器lambda,但问题是我不能验证文件的内容类型。如果我没有提供
['starts-with', '$Content-Type', `image/`]
到我的createPresignedPost
函数,系统自动分配binary/octet-stream
内容类型对象,这是一个问题,因为我不能匹配它与我允许的内容类型(说jpg, png和jpeg)。
但是如果我添加条件,用户可以在提交具有不同内容类型的文件时,在头中手动发送允许的内容类型,假设他们写了Content-Type: image/png
,但实际上发送了可执行文件,即使在处理器lambda中我也无法验证,因为当我在s3上为文件执行getObject
或headObject
命令时,它返回在表单中提交的内容类型(image/png
),即使实际的内容类型不同。
我很确定必须有某种解决方案来实际知道文件类型是什么,而不依赖于用户给你有效的信息。有什么我没看到的吗?
我也遇到过你想要解决的问题。
问题是文件的内容和它的content-type
元数据之间没有关系。
重要的是要理解content-type
头是HTTP标准的一部分。它被设计成允许服务器向客户机提供有关内容类型的信息。当客户端请求对象时,S3实现使用对象元数据发送此信息。
在非s3实现中,服务器完全控制内容。在这种情况下,它评估内容并根据其逻辑发送信息类型。
S3没有此功能。它接受对象content-type
元数据中的任何类型的内容和任何值。当有人请求该联系人时,它将收到最初通知的content-type
。
来解决这个问题,你需要接收的内容,验证它,把正确的类型,并将它直接上传到S3。正如你在评论中提到的,放弃url对你没有帮助。