S3-импортированные изображения иногда повреждены: рендеринг в Chrome, но не в Firefox - PullRequest
0 голосов
/ 20 февраля 2019

Одна часть нашего приложения связана с повторным размещением удаленных изображений в нашем собственном хранилище 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')

Выше приведен мой код импорта S3 с использованием рубинового драгоценного камня AWS-SDK-S3, запущенного через работника Sidekiq в среде Rails 5+.Я должен подчеркнуть, что эта проблема искаженного изображения является периодической;97% моего другого импорта прекрасно работают во всех браузерах и настройках, поэтому я не думаю, что это проблема с моим кодом.

Мое лучшее предположение, что изображение портится на одном из двух шагов: в open() (чтение URL удаленного изображения) или часть, в которую мы импортируем S3.Поскольку изображения могут отлично загружаться в Chrome, я думаю, что на последнем этапе это, скорее всего, будет проблемой.Возможно ли, что отключение Sidekiq в результате развертывания / перезапуска приложения (Heroku) может как-то повредить импорт файлов?Просто предположение.

Мои вопросы: почему это происходит?Как сделать так, чтобы при импорте в S3 не происходило искажение изображения?Можно ли как-нибудь автоматически проверить достоверность образа после импорта, кроме запуска экземпляра Selenium под управлением Firefox?

1 Ответ

0 голосов
/ 04 марта 2019

Мне удалось предотвратить дальнейшие случаи этого, специально включив заголовок content-type в мой вызов obj.put.В частности, эта строка теперь выглядит примерно так:

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

Интересно отметить, что установка типа содержимого для поврежденного изображения после будет импортировано в S3не искажать изображение.Таким образом, проблема не в том, что S3 не отвечает с действительными заголовками для изображения, а в том, что повреждение происходит во время импорта.В то время у меня была сильная догадка, но это дало мне больше ясности в этом вопросе.

...