アプリの一部は、リモートイメージを独自のS3バケットに再ホストし、結果をサイトに表示することに関係しています。場合によっては、画像をインポートすると、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')
上記は、Rails5以降の環境でSidekiqワーカーを介して実行されたAWS-SDK-S3rubygemを使用したS3インポートコードです。この破損したイメージの問題は断続的であることを強調する必要があります。他のインポートの97%は、すべてのブラウザーと設定で完全に正常に機能するため、コードの問題ではないと思います。
私の推測では、イメージは2つのステップのいずれかで破損します:at open()
(リモートイメージのURLを読み取る)またはS3にインポートする部分。Chromeでは画像を完全に正常に読み込むことができるため、後のステップで問題が発生する可能性が高いと思います。アプリのデプロイ/再起動(Heroku)の結果としてSidekiqがシャットダウンすると、ファイルのインポートが何らかの理由で破損する可能性はありますか?ただの推測。
私の質問は:なぜこれが起こるのですか?S3にインポートするときに画像の破損が発生しないようにするにはどうすればよいですか?Firefox駆動のSeleniumインスタンスを実行する以外に、インポート後にイメージの有効性を自動的にチェックする方法はありますか?
呼び出しにcontent-type
ヘッダーを具体的に含めることで、これがさらに発生するのを防ぐことができましたobj.put
。具体的には、その行は次のようになります。
obj.put(body: open(REMOTE_PATH_TO_IMAGE), acl: 'public-read', content_type: "image/jpeg")
S3にインポートした後に破損した画像のコンテンツタイプを設定しても、画像の破損は解消されないことに注意してください。したがって、問題はS3がイメージの有効なヘッダーで応答しないことではなく、インポート時に破損が発生することです。当時は強い予感がありましたが、これで問題がより明確になりました。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加