S3导入的图像有时会损坏:在Chrome上渲染,但在Firefox上渲染

时间:2019-02-20 04:19:47

标签: google-chrome firefox image-processing amazon-s3 corrupt

我们应用程序的一部分涉及将远程图像重新托管到我们自己的S3存储桶中,并将结果显示在我们的网站上。有时在约3%的情况下,导入映像会导致Firefox认为映像已损坏,从而导致控制台出现Image corrupt or truncated.错误。但是图像在Chrome中的呈现效果非常好,除非在“打印页面”对话框中显示 ,然后它表现出与Firefox相同的行为。在所有情况下,它似乎都能在Safari上运行。

当我将同一文件重新导入到S3或什至是另一个托管站点(如imgur.com)时,问题仍然存在。我创建了一个小提琴,您可以在其中使用已知的损坏的映像自己测试负载行为。

https://jsfiddle.net/ysLa27bo/1/

s3 = Aws::S3::Resource.new(region: 'us-west-1')
obj = s3.bucket(MY_BUCKET_NAME).object(MY_S3_DIR_PATH)
obj.put(body: open(REMOTE_PATH_TO_IMAGE), acl: 'public-read')

上面是我在AWS Rails 5+环境中使用AWS-SDK-S3红宝石gem通过Sidekiq工作者运行的S3导入代码。我应该强调指出,此损坏的图像问题是断断续续的;我的其他导入产品中有97%在所有浏览器和设置中都能正常运行,因此我认为这与我的代码无关。

我最好的猜测是,图像会在以下两个步骤之一中损坏:在open()(读取远程图像URL)或导入S3的部分。由于图像可以很好地在Chrome中加载,因此我认为在后面的步骤中可能会出现问题。由于应用程序部署/重启(Heroku)而导致Sidekiq关闭可能会以某种方式破坏文件导入吗?只是一个猜测。

我的问题是:为什么会这样?导入S3时如何确保不会发生图像损坏?除了运行Firefox驱动的Selenium实例之外,我还有什么方法可以自动检查导入后的图像有效性?

1 个答案:

答案 0 :(得分:0)

通过在我的content-type调用中特别包含obj.put标头,我已经能够防止发生这种情况的进一步情况。具体来说,该行现在看起来像:

obj.put(body: open(REMOTE_PATH_TO_IMAGE), acl: 'public-read', content_type: "image/jpeg")

有趣的是,在导入到S3之后的 中设置损坏图像的内容类型不会破坏图像。因此,问题不在于S3没有使用图像的有效标头来响应,而是损坏是在导入时发生的。当时我有很强的预感,但这使我对问题更加清楚。