您的目标是相互矛盾的,即不想在上传过程中将其存储在本地,但又想再次不必要地下载以制作缩略图。如果您想获得技术灵巧奖,您可以同时将文件上传请求正文流式传输到本地临时文件以及 S3。或者,您可以像其他行业一样将其存储在本地临时文件中,然后对其进行缩略图,然后将所有尺寸上传到 S3。这些方法中的任何一种都减轻了立即从 S3 下载以制作缩略图的需要。
您打算如何验证它确实是一张图片?您可以查看文件数据的第一块并验证文件类型的幻数,如果这会给您带来温暖的模糊感,但最终它是不受信任的用户数据。假定图像文件的后半部分可能是病毒代码,并且在Content-Type
标题处很容易伪造。听起来您的安全问题主要是由FUD驱动的,而不是您打算防御的特定威胁。只要您不获取用户上传的数据,将其标记为可执行并在您的服务器上以 root 身份运行,任何非图像数据都会损坏并且无法在浏览器中正确呈现(和/或导致您的thumbnailer 程序以错误退出或在极端情况下可能崩溃)。
关于验证,我可以尝试创建一个缩略图,如果我不能,那么它不是有效的图像并将其删除。这条路好吗?
大多数时候,是的。在某些极端情况下,您的缩略图无法处理图像,但浏览器可以处理,因为缩略图并不完美,并且某些图像已部分损坏。例如,我发现一些动画 GIF 在 Web 浏览器中渲染和动画效果很好,但 graphicsmagick 试图处理它们时崩溃。不确定对于那些 0.01% 的边缘情况可以做些什么。
对于上传部分,我可以向用户发送响应,然后继续创建缩略图并将其存储在 S3 中吗?
是的,这通常是最好的方法,这样用户就知道他们的上传成功了。通常,图像处理通常被构建为“工作队列”模型,您只需记录有工作要做,然后继续,一个或多个单独的进程将工作从队列中取出并完成它。