Rails でファイルのインポートやダウンロードのついたシステムを開発中なのですが
サイズの大きいファイルのダウンロードやアップロード中
左下に localhost を待機しています
とでるだけで本当に処理がすすんでるのかどうかわかりにくいです
途中で進捗報告を表示して画面を更新するにはどのような機構を使えばいいのでしょうか
ダウンロードボタンと同時にクライアントで JS を起動しておいて
一定時間ごとにサーバーに進捗を問い合わせて結果で画面のDOMを更新
みたいな方法しか思いつかないのですが
どの接続がどの進捗をほしがってるのか対応をとるのも大変そうだし
普通はどのような方法を使うのでしょうか
追記:
ファイルインポート・エクスポートに進捗報告をつける方法をずっと調べていたんですが
Rails でコントローラーが処理中に進捗報告等の別のリクエストに返答を行いたい場合
非同期処理についていろいろ調べたのですがどれも別のジョブサーバーを立ててキューを保存するらしく
本当にそんなことまでしないと進捗報告というのは実現できないのでしょうか
Apache では普通に別リクエストには別のプロセスがわりあてられて
同時処理してくれる気がするのですがRailsでできないのは何か理由があるのでしょうか
別にサーバーをたてるとなるとリソースやキューのモニターやログの監視も必要になるし
同じクラウドのマシン上で動かすとリソースも問題になるし
とくにいずれもアップロードしたファイルや生成したダウンロードファイルをジョブサーバーとコントローラーでやりとりしなければいけないので非常に無駄な気がするのです
学生時代に習った低レベルのTCPソケット通信であればインポートの場合
アップロードリクエストをうけとったら進捗メッセージを徐々に返して
それをJSでゆっくりよめばいいだけだし
エクスポートでも準備中に少しずつ進捗メッセージを返して
準備完了メッセージを返したらそれ以降をダウンロードデータとみなすみたいにすれば
1度のリクエスト+レスポンスだけで実現できる気がするのですが今のウェブ技術では不可能なのでしょうか
一応少しずつレスポンスしたりそれをよんだりするのはSSEやFETCHという技術でできるみたいなのですが
どちらもテストコードをかいて通信するところまではできたのですが
POSTでリクエストを送ってそのままそのコネクションを使ってレスポンスをストリームでうけるというのができないみたいで…
そうなると別のコントローラーを叩くことになっていずれにしろRailsに並列処理が求められます
追記
Rails:
self.response_body = Rack::Chunked::Body.new(Enumerator.new do |y|
参考: http://ode.hatenadiary.jp/entry/20120123/1327301403
javascript:
fetch() .then((response) => response.body.getReader()) .then((reader) => {}
参考: https://sbfl.net/blog/2018/05/26/javascript-streams-api/
でファイルアップロードリクエストの後レスポンスをストリームでうけとれるようにできました
ただせっかく実装して動作までしたのに今回の案件の動作環境にはいっていたIE11がFetchに非対応だったのでまた別の方法が必要みたいです…
IE11で動くJS側でレスポンスを途中で読む方法はないでしょうか…
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/10/25 10:27 編集
退会済みユーザー
2018/11/01 10:01