質問: 現在RailsとReactNativeを使ってモバイルアプリの開発をしています。 やりたいこと ------ サーバーサイドでs3からダウンロードした画像を、直接クライアントに複数枚まとめて送りたい。 現在の実装 ----- クライアントからアップロードされた画像はS3に保存していて、保存した画像をクライアントに返す際はs3のpresigned_urlを返してクライアントサイドで読み取り、表示させています。 ### 現在の実装の問題点 presigned_urlをクライアントに渡す方式だと、クライアントがRailsサーバーからのレスポンスを受取った後に再度presigned_urlに対してリクエストを送り、画像を取得する必要があります。 この方式だと、まとめて10枚程度の画像を取得したい時に読み込みが完了するのにかなり時間がかかってしまいます。 まとめ --- 以上の点を踏まえて、s3からのファイルのダウンロードはRailsサーバーの方で済ませておいて、Railsサーバーからクライアントに直接ファイルを送る形式をとりたいです。(複数枚同時に) send_fileのドキュメントを見ても複数枚画像を送るような方法が書かれていなかったため、何か良い方法をご存知であれば教えてください。
回答: ### 前置き 1度の `HTTP GET` で10枚程度の画像を全て取得したい、という意味でしょうか? その場合「Rails サーバー ⇔ クライアント」の通信が「S3 ⇔ クライアント」のそれよりも明らかに速くない限りそれほど変わらないと思います。 (基本的に `GET` のレスポンスを全て読み終わるまで表示できませんので、Rails サーバーからのレスポンスサイズが増える分、ユーザーの体感的には逆に遅く感じるかも知れません。) 「S3 の応答が遅い」という事であれば CloudFront 等 CDN を検討してみて下さい。 ### 本題 極端な話、`GET` で返すファイル形式はサーバーの任意ですので、クライアントが認識可能ならどのようなバイナリ形式で返却してもかまいません。 一般に、複数のファイルをサーバーから返却する場合は zip 等のコンテナ形式を採用すると思います。オリジナルのコンテナフォーマットを作成し(例えば、単に画像バイナリを連結したバイナリ、とか)返却しても良いと思います。