Webサイト制作初心者用質問スレ part249
■ このスレッドは過去ログ倉庫に格納されています
初心者だろうが誰だろうが、 まず >>>■ 検索してから ■<<< 質問すること ネタ・煽り・自演・荒らしは完全放置 【質問時の注意】 1. 質問する前に >>2 にも目を通すこと 2. メール欄に何も入れないことを推奨 (IDを出して騙りを防止するため) 3. 質問者が返信する際は「最初に質問したレス番号」を名前欄に入れること 4. ブログについてはブログ板で質問すること ●ブログ板 http://mevius.5ch.net/blog/ 5. SEO、アドセンス、検索サイトに登録しても検索結果に引っかからないといったことは SEO関連スレで質問すること http://find.5ch.net/search?q=seo 6. アクセス解析については該当スレで質問すること http://find.5ch.net/search?q=%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E8%A7%A3%E6%9E%90 7. 製作ソフト(Dreamweaver DW、ホームページビルダー、等)を使用した場合の質問は該当スレで質問すること 8. CGI、PHP, Perl, Ruby 等のプログラミング関連や CMS, Wiki は Webprog板、またはこの板の該当スレで質問すること ●WEBプログラミング板 http://medaka.5ch.net/php/ 9. JavaScript はこの板の該当スレで質問すること 10. 画像作成ソフト(Photoshop 、Illustrator、等)については該当スレで質問すること 11. HTML, CSS, CGI, 制作ソフトなどのどんな本を買えばいい?といったことは書籍についての質問スレで質問すること http://find.5ch.net/search?q=%E5%BD%B9%E3%81%AB%E7%AB%8B%E3%81%A4%E6%9B%B8%E7%B1%8D%E3%81%AF 12. 質問内容を吟味して、正しい日本語で第三者が読んでも分かるように質問を書くこと 13. 間違った回答をする人もいることに注意 【前スレ】 Webサイト制作初心者用質問スレ part248 http://mevius.5ch.net/test/read.cgi/hp/1494150188/ VScodeで、 HTMLタグにカーソルを重ねるとタグの説明がポップアップするのを止めるには、 どこの設定を変えればいいのでしょうか? 自分でも探しているのですが、見つけられないのです >>663 まずreset.cssを入れるんだ そうすれば全ての文字サイズが同じになる 懐かしい そういえばreset.cssはもう使ってないなあ でもどのブラウザ・デバイスでも崩れない MDLとbootstrapだったらMDLの方が良い? >>662 プログラム板の、VSCode のスレで聞いて リンクをふんだときにサーバーがレスポンステキストをゆっくり返して そのタイミングにあわせて処理ってできますか? たとえばダウンロードボタンを押したときにファイルを準備するのにサーバー側で時間がかかるとして サーバーからくるレスポンスの最初の10文字は準備状況を知らせるのに使って 10秒おきに1文字ずつ流れてくるみたいな感じで クライアントでは1文字うけとるごとにプログレスバーをふやしていって10文字目がとどいたら それ以降をダウンロードファイルの中身とみなしてダウンロード処理する みたいなことってブラウザの標準機能とJavaScriptで実現できたりしますか? >>669 jsで10秒おきに一文字増やせば済む話 phpなら出来るといえば出来るけど、処理が意味不明すぎる 文字列を受け取る必要が無い 10秒ってのはサーバー側の都合で1秒かもしれないし30秒かもしれない ダウンロード前の準備にどれぐらいかかるかわからないので サーバーの準備状況をクライアントにつたえたいって意味でした >>669 ゆっくり処理を返す事は可能だが、現実的ではない ajax使うのが一般的 後、そもそもの設計がおかしいと思うがね >サーバー側で時間がかかるとして ここに時間を掛けないようにすれば全て解決する 仮にサーバーまるごとバックアップとかなら、 そんな処理をかまさずにcronで深夜にzipを作っておいて、 それをDLするだけで良い データベースは他のAPIとかから頻繁に更新される状態で リクエストをうけとった時点でデータベースからデータをもってきてZIPを作って返したいんです ajax を使う実装も試みたんですけど 受け取ったリクエストをダウンロードにみせる方法がわからなくて断念したんですよね >>663 それよりこの壁紙は何ですか?おじさんに教えなさい。 669だけど結局1週間たって解決しなかった… Rails サーバーで画面はリソースモデルの6画面そのまま index が一覧画面になってて そこに検索機能がついててカラムの値でいろいろ検索というかしぼりこみができるようになってて データ1つ1つがCSVファイルをもっててそれは前もってAWSのS3に保存してあるんだけど 最終的に絞り込んだ検索結果のCSVだけをS3からもってきてZIPを作ってダウンロード っていうことが要求されてる 何も考えずに実装するとダウンロードボタンをクリックした瞬間ZIPを作り始めるて ZIPが完成してから send_data で送り始めるからダウンロードが始まるまでに数分かかる その間 chrome だと左下に localhost... を待機していますって出るだけでUI的に不親切だし タイムアウトする可能性もあるから何らかの通信はし続けたいんですよね ZIPをストリームで作ったそばから送ることができれば ブラウザ側のダウンロード進捗がでてくれるからそれですむ話なんですけど RailsサーバーでZIPを作りながらストリームで返すのがなかなか難しい あとインポートの機能もあるのでどっちにしろインポートでは何かしらじぶんで進捗をかえさなきゃいけない なのでコントローラーが処理中に>>669 みたいな何らかの進捗レスポンスを返したいと思った次第なんですが こっちもajax使ったりSSEだったりfetchだったりいろいろ使ってみたけど リクエストレスポンスを1つのコネクションでできなかったりIEが対応してなかったりで結局解決しなかった… しかも Rails と JS 両方が普通のHTTP通信じゃないことしなきゃいけないから両方に詳しい知り合いがいなくてきくにきけない ダウンロードアップロードに進捗つけるのってふつうに需要りそうなのにこんなに大変なんですね 普段はJSやCSSとかフロントエンドメインで バックエンドはApache 上に PHP CGI おいて フォームからきたデータを MySQL に保存するぐらいしかやったことがないので Rails 初めてさわったんですけどフレームワーク使うと逆に制限が多くてやりたいことができなくて苦労します すいません 質問なんですが要点もしぼりきれないんですよね いろいろ実現する方法はあるけどどれもチャレンジしてみるとつまってしまって… 何か1つでもいいので >Rails サーバーで画面はリソースモデルの6画面そのまま index が一覧画面になってて >そこに検索機能がついててカラムの値でいろいろ検索というかしぼりこみができるようになってて >データ1つ1つがCSVファイルをもっててそれは前もってAWSのS3に保存してあるんだけど >最終的に絞り込んだ検索結果のCSVだけをS3からもってきてZIPを作ってダウンロード これがタイムアウトせずに IE 含めたモダンブラウザで実現できる方法が知りたいのです サーバーサイドでかつオンデマンドでzip圧縮をかけるというのは糞設計。 同じタイミングで100人からアクセスあったらどうなる? クライアントからそういう要求がきたらどういう設計がいいの? サーバー側でアクセスが多いページの圧縮データをキャッシュしとけばいいんじゃ zip圧縮って何に対してzip圧縮なの 管理画面なら我慢してくれと歯科 まあ設計の良し悪しは別にしてそういう仕様でも作ろうと思えば作れるけどな >>675 IEで動かないってfetchで動くコード作れてんならIEの方がもっと楽だぞ UAみてIEかどうかで分岐いれてIEの場合XMLHttpRequestとほぼ同じメソッドでストリームが受け取れる拡張仕様があったはず むしろ他のブラウザの場合だけfetchなりweb socket なりが必要になるだけ まあsyntax errorがでるとJS全体が動かないからES6使えないのがだるいが まあjavascript側は何とでもなる どちらかというとサーバーでストリームでデータ流すのがわりと環境に依存するから難しい フレームワークでレスポンスフラッシュするコードかいても ホストサーバーやプロキシが勝手にキャッシュしてストリームにならなかったりする 自分はRailsは分からんが なんかもうボタン押す(phpファイルにアクセス)とイベント発火、ファイル生成 そのファイルの存在を確認してPHPからhtmlにDボタンなどを作成・・ という原始的なのが最も良い気がしてきた 少なくともトレイトやらなんやらをユーザーに押し付けない方が良いと思う ダウンロードに進捗つけるだけってそんな大変なん? そこらへんのしょぼいサイトでも普通にやってることやん >686 一見普通に見えるそれは、一見それっぽく見える処置を見せてるだけ それにまんまと騙されてるだけで、幸せですなーとしか思わない 種明かしすると、それまでスムーズに進んでいたものが30%ぐらいでピッタリとまったり、 99%ぐらいでピタァ圧止まることあるでしょ。それ あほくさw ダウンロードの処理はメチャクチャめんどくさいし、そんなもん実装しても誰一人得しない もう今まで通り30%でピタッ!99%でピタッ!で良いと思う それでも本気でダウンロードの進捗を見せたいっていうなら考えるけど ただのダウンロードでユーザの元に到着してるファイルサイズに対して進捗をつけるのは簡単 ダウンロードが始まる前にサーバー内でごちゃごちゃやってることに対して進捗をつけたいっていうから難しい つーかそんなレスポンスに時間かかるなら非同期処理にしてレスポンスだけはすぐ返すもんじゃね Railsだとその間ウェブサイト自体が他の接続に応答しないのは問題だろ 内部向けの管理画面っぽいからそれでもいいのかもしれんけど まあセッション間で進捗情報を受け渡す必要がでるから進捗つけるのはさらに面倒になるけどな あれはファイルの数の進捗を見せてるだけだよ しかも名前順なので、最後にデカイファイルが来るといつまで立っても99%から進まない 進捗どうこう言うならそれこそいっこのzipにして後はブラウザの標準機能に任せればいいと思う ttps://teratail.com/questions/82898 677です いろいろリプありがとうございます >>678 ,681,682 別に圧縮をかける必要はないんです 無圧縮ZIPでもいいので「1操作で」「動的に選択した複数ファイル」をダウンロードできればいいのですが >>683 教えてくださいお願いします >>684 XDomainRequest.onprogress のことでしょうか ttps://developer.mozilla.org/en-US/docs/Web/API/XDomainRequest をよんで試した見たんですがサンプルコードの if(window.XDomainRequest) が undefined になるんですよね よくよくよむと that worked in Internet Explorer 8 and 9. It was removed in Internet Explorer 10 ってなってて IE11 だめみたいです >>688 それも考えたのですがRailsで非同期処理するのが思いの外大変で… 別にサーバーをたてないと非同期処理ができないみたいで… apache だったらデフォルトで同時リクエストうけつけてくれるのに… まあでも内部用の管理画面なのでコントローラーを占有するのは問題ないはずです (その間操作できないことがUI的に親切に伝わればですが >>687 やっぱり難しいんですね… 難しいってことがわかればあきらめるんですけど 一見当たり前についててほしいものなのでこんなこともできないのかって思われそうで… 要件定義しないとなぁ >>678 みたいなのがあればタイムアウトなんて絶対に起きる 自社の管理いステム限定の処理なら起きないだろうという事は推測できるけど 前日で決まってる+数パターンなら夜中に作っておくという処理も考えられる 要はその間に通信をし続ければいいんですよね いくら巨大なファイルをダイヤル回線みたいな細い回線でダウンロードし続けても 進捗がある限りタイムアウトっておきないじゃないですか ZIPをストリームで送る 処理中にレスポンスをストリームで少しずつ返してそれをJS側で進捗とみなす 非同期にしてレスポンスはすぐ返し、ajax で polling して進捗を返すAPIを追加する のどれかができれば可能だとは思うんですが どれもが Rails + IE っていう制約だとなかなかうまくいかなくて… つーかもう質問内容が初心者スレの内容でもないし >>1 よんで webprog 板いったほうがいいんじゃね ここはどっちかっていうと HTML CSS みたいなマークアップ関連の質問するところな気がする まあRailsスレなんて人いるか知らんけど IEはまじでjavascript触る人にとっては癌だよなー IE対応ってだけでjavascriptの工数倍とってもいいぐらいだわ ES6使えないだけでも糞すぎ >>696 そのためにbabelがある。babelがない時代ならともかく 今それを言ったら、技術力低いってバレるぞ IEはjsじゃないからな jsの工程多いなら別料金取れる >>697 だったら答えてやれば? >IEでTransfer-Encoding: chunked受信する方法 ajax関係はむしろもっと低レベルなAPIで仕様を統一してくれないとどうしようもない いまの話題でBabelとか言い出しちゃうほうが技術力低すぎ ブラウザのHTTPハンドリングの内部実装やプロトコルのはなしなんだからbabelじゃ何も解決できん ms-streamとか変なもん作ってるから… >>697 Babelってただの互換性吸収変換器だしなー 変換先のJSがIEで不可能なことはそもそも不可能なんだよなー IE11のサポートは2025年10月までだからがんばれ サポートって言っても何もしてないがw >>699 それはJavaScriptの話じゃない。 勝手に話をすり替えんな >>696 > IEはまじでjavascript触る人にとっては癌だよなー > IE対応ってだけでjavascriptの工数倍とってもいいぐらいだわ > ES6使えないだけでも糞すぎ JavaScriptの話だよな? どうもIEの話とごっちゃにしてるバカが多いけど、 JavaScriptの問題。特にES6はBabelで解決できるよ jsだろうとなんだろうとIEが糞って事には変わりないよ 質問者はIEでストリームレスポンスできる方法きいてるのにアスペかこいつ 質問と無関係な雑談したいならスレチ >>696 は質問者(?)じゃないんですが? 勝手に別の人への回答にするなよ >>696 にレスししてるのに、 勝手に別の人への質問にすり替え、 解答が違うとか、なにそれwww どう見ても質問じゃないだろ そのレスのどこでなにを質問してんだ アスペな上に日本語不自由か fetchがIEで使えなかった →IEくそだよなー →Babel 使え ← は? マウントレスするならはなしのながれぐらいつかめるようになりましょう >>710 だから>>696 にレスしてるだけだっつーの お前がアスペだろw 初回のレスでいきなりマウントレスするようなやうにかまうから まわりでBabelなんて使ってるやつ知らんのだが 学習コスト導入コスト変換コストがかかるだけでも工数が増えるしそれだけでも糞だろ 保守でBabelが使えることも条件になるしな >>692 WinJS.xhs ってのがある XMLHttpRequest のラッパーになってて ストリーム受信含むいろいろなことができるらしい 自分は使ったことはないんだけど クソ雑魚ばっかりwww >>692 > それも考えたのですがRailsで非同期処理するのが思いの外大変で… > 別にサーバーをたてないと非同期処理ができないみたいで… Railsで非同期するならActiveJob使えばいいやん? 普通にフレームワークに搭載されてる >>675 別にRailsでZIPをストリームで返すことはできるけど、 それで本当に良いのかって話がある。 S3を使っているなら、Railsアプリを経由せずに、直接S3からダウンロードしたほうが良いからだ。 AWSは詳しくないが、同一リージョンならEC2(Railsサーバー)と EC2の通信量は無料じゃないか?ならZIPもS3に作成し、 そこから直接ダウンロードしてもらったほうがコストも速度も良くなるだろう その時のダウンロードURLについてはSigned URLが重要になってくるな RailsでZIPをストリームで作ることもそんなに大変とは思わないが、 ダウンロードが始まるまでに数分かかるというのなら、ページ移動してしまう可能性もある。 だから一つのセッションとかに頼るのではなくて、非同期でZIP作成して ZIPの作成の完了をAjaxで定期的に問い合わせたりすればいいだろう そのときに、どこまで処理が済んだかを記録しておけば、ZIP作成の進捗状況を出すこともできる。 ダウンロード・アップロードも何処までデータを送信したか、受信したかを記録しておけば (ダウンロード・アップロードとは別のセッションで)Ajaxを使って通知することは可能 S3から直接ダウンロード・アップロードさせる場合はIEでダウンロード・アップロードの 進捗状況を表示するのは難しいが、(ZIP作成の進捗状況通知ならできる) Railsアプリを通すという前提であれば、IEでもできるぞ。 >>677 > これがタイムアウトせずに IE 含めたモダンブラウザで実現できる方法が知りたいのです 可能 前提として時間がかかる処理は非同期で行う。これが鉄則。 Railsで非同期処理をするならActiveJobなどを使えば良い S3ということだからAWSを使ってるのだろうけど、AWSの 非同期処理を行えるサービス(詳しくは知らない)を使うのもいいだろうな まずRailsアプリはダウンロードのリクエストがきたら、それを非同期で 処理するようにしてクライアントにはすぐにレスポンスを返す。 サーバー側では非同期でゆっくりとZIP作成でもすればよい。 作成したZIPはS3に置いたほうがコストとパフォーマンスの両面で良いだろう。 スケールさせる場合(マシンの台数を増やした場合)同一のインスタンスに アクセスするとは限らないという問題もある。ローカルディスクに保存してると、 作成したサーバーとは別のサーバーに接続したときにファイルが見つからない サーバーが1台しか建てないっていうのなら、ローカルにZIPを作成してもいいけど。 そしてZIP作成の進捗状況はAjaxで定期的に監視すればよい。IEでも対応可能。 ダウンロードする場合のおすすめはS3に置いたZIPファイルを直接ダウンロード してもらう方法だが、Railsアプリを経由してダウンロードする方法もあるにはある 質問からすれば、ZIPを返すまでの待ち時間の解決がメインみたいなので ダウンロードの進捗状況までは知る必要はなさそうだが、やろうと思えば、 何処まで送信したかを記録することで、Ajaxで通知することは可能 >>694 RailsアプリからZIPをストリームで送るということをやるなら、 別にJavaScript側でいろいろやる必要はない。JavaScriptもAjaxも何も要らない やり方は、単にRailsアプリでメモリ内にZIPデータを作って返すだけだぞ 必要なのは、それができるライブラリを探すだけだろうな あと「進捗がある限りタイムアウトっておきないじゃないですか」の解決策として 「非同期にしてレスポンスはすぐ返し」と書いているようだが、 Ajaxはすぐにレスポンスを返して通信を終了しているわけで、 「進捗がある限りタイムアウトが起きない」のとは関係ない話になってるぞ Fetch APIなどを使って細かいチャンクごとにデータを受け取ってローカルで保存する方法はあるが それを使わなくてもIEでも「進捗がある限りタイムアウトっておきない」だろ? ゆっくりデータを返すのに必要なのはサーバーの対応だけで、IEだからって話にはなってない。 ついでに、Fetch APIなどを使って細かいチャンクごとにデータを受け取る方法だが、 つまりはTransfer-Encoding: chunkedに対応するってことだが、 これはChromeなどでJavaScriptを使って対応することは可能だが、 それはそれとしてだ、サーバー側での対応も必要だぞ。 ダウンロードのためのリクエストが細かく送られてくる、それも一つのセッションではなく チャンクごとに別々のセッションでリクエストが飛んでくるので、Rails側でそれに対応して 細かいチャンク毎にデータを返すように作らないといけない だからZIPデータを(メモリに)作りながら、データを返すっていうのは難しいんだよ。 なぜならZIPを作成しているセッションとは別のセッションで次のチャンクの要求が来るからね ちなみにS3はこの細かいチャンクごとのダウンロードに対応しているから、 S3からFetchAPIなどでダウンロードする方法の方が、サーバー側でチャンクごとのダウンロードを 実装しなくてすむ。つまりは、S3のCSVファイルからZIPを作ってS3に置くって話に戻るわけだなw 俺は>>696 にレスしてるだけだっていうのに、 本来の質問者に対してレスしろとか言われたから、 レスしてやったぜwww 途中参加で駆け足で思いつくまま書いたからわかりくいだろう。 続けてやるから、質問を続けるが良い 692 です >>716 ありがとうございます これから調べて試してみようと思います >>717 丁寧にありがとうございます >Railsで非同期するならActiveJob使えばいいやん? 軽く調べてみたらコード自体は簡単にかけるんですけどそれを動くようにするのに sidekiqとかredis?みたいなジョブサーバーを建てないといけないみたいで サーバーをたてるとなるとリソースの問題やモニタリングやログ監視とかも必要になってきて たかがダウンロードに進捗つけるのにそこまでしなきゃいけないものなのかなと… >別にRailsでZIPをストリームで返すことはできる 何っていうジェムをつかえばいいんでしょう ファイルを逐次追加はできても send_data send_file できるのは zipが完成してからってジェムしかないんですよね zip自体はエントリ単位でストリームに対応してるアルゴリズムらしいのですが >ZIPもS3に作成し できればファイルに残さずメモリ上で処理したいんですよね ダウンロードはこれまでも何度かつけたことがあるんですがファイルを作ってリダイレクトだと 完了したあとダウンロードされないことがあるとサーバーにごみが残り続けるって問題があって… >非同期でZIP作成してZIPの作成の完了をAjaxで定期的に問い合わせ 仰る方法で実現することはできると思うし多数のユーザからリクエストが来るならそうするべきですが 今回内向け管理画面でオペレーターがひとりって想定でコントローラを専有してOKなので いちばんはじめに>>669 で質問したように >>669 ができればコーディングもリソースも楽なんですよね… 非同期処理にしても忙しい処理してる最中にポーリングして進捗にうけこたえするのって無駄な気がするんです それに比べればKeeo-Aliveで進捗をストリームで受け取ることさえできれば サーバー側でタイミングや頻度もコントロールできますしね 結局IE上のajaxでレスポンスをストリーム受信することって無理なんでしょうか… Chromeではfetchのreadablestreamをつかってダウンロード進捗が動いたのでサーバーからはflushできてるみたいなので あとIEで送られてきたレスポンスをバッファせず受け取ることさえできればすべてが解決するんですが… > 完了したあとダウンロードされないことがあるとサーバーにごみが残り続けるって問題があって… cronでも使って定期的に後片付けすればいいよ > Chromeではfetchのreadablestreamをつかってダウンロード進捗が動いたのでサーバーからはflushできてるみたいなので ZIPを作成するまでの待ち時間が問題なんじゃなかったのか? fetchのreadablestreamはJavaScriptでのダウンロード中に画面更新ができるという話で、 ZIP作成までの待ち時間は別の話だし、そもそもJavaScriptでダウンロードするのではなく ブラウザにダウンロードさせれば画面更新は行えるだろう? 本当にやりたいことは何? > >別にRailsでZIPをストリームで返すことはできる > 何っていうジェムをつかえばいいんでしょう 知らん。でも原理的にはできるだろ? データ作りながら出力するだけ どうやってS3のCSVファイルを参照しているのか知らんが、 ファイルとして扱えるのなら、zipコマンドでファイルに 書き出すのではなく標準出力に書き出せばできるはず >>723 > いちばんはじめに>>669 で質問したように >>669 ができればコーディングもリソースも楽なんですよね… それが楽という理由がわからん。 ダウンロードボタンを押されてサーバーにリクエストが飛んで、 サーバーがZIP作成などの処理を実行中に、その進捗状況をデータベースや ファイルに書き込んでおいて、Ajaxで進捗状況を監視するのも大差ない。 むしろその方がJavaScriptで受け取ったデータの最初の10文字を消して CSVファイルを保存するよりも楽だろう そういやZIPを作成しつつストリームでデータ返すなら 最終的なZIPのサイズは不明だから、何%終わったとかは 出せないな。何バイト送信したっていうのなら出せるけど いるよな質問者が本当にやりたいことは何ひとつ答えずに 自分の経験でしか語れないやつ わからないなら黙ってればいいのに 1回のリクエストレスポンスでIE以外ではすでに実現できてるっていってるのに 今更全く別の無駄だらけの方法を1からやれってバカすぎる たかがダウンロードに進捗つけるのにジョブサーバーとかcronとか こういうリソースのこと何もかんがえないやつにサーバーサイドやらせた結果障害だらけになるんだろうな sidekiqはまじでやめとけ 直接かかわったことはないけど昔sidekiqがメモリリーク起こして頻繁に落ちて 解決するまで何度も夜中におこされて再起動かける別チームのメンバーみてきた つーか Railsってまじで別のジョブサーバーがないと並列リクエストうけられんの? さすがにゴミすぎだろ もうApache 上に直接おけばいいじゃん >>724 >cronでも使って定期的に後片付けすればいいよ 基本的にフロントエンドでサーバーサイドはコードをいじれるってだけで インフラの知識がないのでコマンド叩くとか基本的に設定をいじるとかそれも一苦労なのです >ZIPを作成するまでの待ち時間が問題なんじゃなかったのか? そうです >本当にやりたいことは何? ダウンロード前のZIP作成中に進捗を表示したい 例えばファイルを1つZIPに追加するごとに全体何ファイル中何ファイル目という進捗をクライアント側に送りたい >fetchのreadablestreamはJavaScriptでのダウンロード中に画面更新ができるという話 fetchは本当にダウンロード前に encoding:chuncked なデータをリアルタイムでうけとれるんです Rails で render stream:true というオプションをつけるとchunkedデータを返せるみたいで ZIP作成中にファイルを1つ追加するたびにresponse.stream.write("{progress:1}) みたいにかくとダウンロード開始前に chrome 側にレスポンスが流れてきます でさいごに response.stream.write("{complete:zipbody1})をつけておくって javascript 側で complete: をみたら残りをファイルコンテンツとみなして blob を作るという感じで実際に動いてます $ajax や XMLHttpRequest では途中で受け取る方法がわからなかったんですが fetch の readableStream というのを使うとうけとれてこれが IE だけ動きません >>726 >それが楽という理由がわからん サーバーサイドの経験の差なのかも フロントエンドがメインでサーバーはviewとかSQLのやりとりを軽くさわれるぐらいなので ジョブサーバーをたてるってだけでノウハウも何もなくなにをしたらわかりません しかも非同期実行中の進捗をメインコントローラーに受け渡す方法もわからないし 進捗を聞きに来た相手が最初のリクエストした相手と同定する方法もわからないし 逆にいまの方法だとサーバー側は render stream: true と response.stream.witeをかくだけ クライアント側は文字列として取り出しさえできればあとは何とでもなるので… fetch で IE 以外動いてるっていうなら fetch polyfill つかえばええんちゃうん? https://github.com/github/fetch CDNもあるから1行かくだけやで レベル高すぎて何いってるかさっぱりわからない HTMLとCSSとwordpressしかつかえない俺からしたら別世界の話題 >>731 やってみたんですけどだめでした undefined じゃなくなってエラーは出なくなったのでうまくいったかなと思ったのに ttps://sbfl.net/blog/2018/05/26/javascript-streams-api/ ここを参考にjavascript側をかいてたんですが 1行目の .then((response) => response.body.getReader()) がトリガーされずに無反応 IEだけなんでこんな特殊な動作するんでしょうか;; >>716 http://vividcode.hatenablog.com/entry/ie10/xhr-ms-stream ここを参考にコードかいてみたんですけど res.msDetachStream() が undefined WinJS.xhr({ url: uri, responseType: "ms-stream" }). っていう独自の responsetype 使うみたいなのでサーバー側もただ response.write するだけではだめなのかも ただ検索しても ms-stream に関するドキュメントがぜんぜんでてこなくてよくわかりません… 結局今週も解決できず… もうあきらめようかな… バカバカしい。 csvごとき、サーバーでgzipかかるだろうからそのまま落としても大した転送量にならないだろ。 csvのまま取ってきてクライアント側でjsZipでzipファイルにすりゃいいだけだろ。 >>734 なるほどです! 天才です 確かにそれならじぶんができる技術でできそうだし タイムアウトもないし進捗処理も簡単につけられそうです サーバー処理も大幅にかえなきゃいけないけど 現状手詰まりなので試してみたいと思います ありがとうございます XMLHttpRequest って普通に途中のデータ拾えないっけ res.readyState ==4 だけしかみてないなんてないよね? readyState == 3 をみるんだよ ttps://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/dev-guides/hh673569(v=vs.85) ちなみにこれの Comet streaming support のとこね 試したわけじゃないけど IE10 では普通に途中データうけとれるってかいてるんだけどなー >>736 ,737 わー! すごい! できました! しかもコードもすごい短いしIEもChromeもUA分岐しなくても動くし最高です!!! XMLHttpRequestでストリーム受け取るって記事がどこにもなくててっきりできないと思ってたんですが readyStateの3がLoading中って意味だったんですね fetchで作ったコードもほぼ流用できてサーバー側はなにひとつ変えずにすんだし ほんとに助かりました さすがプロの方すごいです 質問してよかったです >>739 >>737 さまですか 本当にありがとうございました 他にもリプいただけた方々ありがとうございました IEは能力自体は高いんだよ。 まだウェブに標準化という考えが乏しかった時代 IE6以外にまともなブラウザがなかった時代が長かったため、 それ以降の標準化への対応が遅れただけで、 搭載されている技術は10年先まで使える技術だったからな なぜIE以外のブラウザはcontent boxとかいうクソ仕様を採用したのか。 >>742 IEってデフォルトでborderboxなのか? IEが独自拡張なんじゃなくて、当時は標準そのものがなかった。 ボーダーをブロックの外につけるか中につけるかそういう仕様自体がなかった。 だからIEが間違いでも独自拡張なわけでもない。 IEの挙動(border box)の方が使い勝手が良かったが 他のブラウザはcontent boxの挙動で実装していた。作りやすかったんだろう。 この時はまだborder boxとかcontent boxなんて言葉はなかった その後だよ。標準化の話が浮上したのは。IE嫌いのやつが 仕様を作ったのか、IEとは違う方が採用されてしまった。 そしてその数年後に、やっぱりIEの挙動のほうが便利だとわかって 挙動を変えられるようになった。このときにようやくborder boxと content boxという言葉ができた。 今では細くデザインを調整する場合は、border boxにするのが常識となっている 作りやすかったのかなんなのか知らんがデザイン側からしたらcontent boxなんてキチガイ仕様以外の何物でもない 標準が間違っていた。(IEが正しかった)という例の一つやな AjaxとかCanvasとか、当時は標準がなかったから仕方なかったが 技術で先行実装していたのは実はIE MSに工数かけさせるための嫌がらせで標準をIEと違えたんだよな。 割を食ったのはユーザー。と、お前ら。 下手にborder boxが混在するとそれはそれでややこしくもあるわけで・・はぁ 後ラッパーかなんかつけないと何かができなかった気がする。ラッパーつければいいだけだけど >>749 その点HTML5は素晴らしかった。 第三者の団体でどこにも利害関係ありませんーを装った、現実を考慮しない 標準化団体の奴ら(おかげで標準化が全然進まなかった)とは違い、 HTML5は各社ブラウザメーカー主導で行われた。 そのため仕様は当時の主流ブラウザ(当然IE含む)の互換性を考慮して作られた。 <!DOCTYPE html> という短い記述はIE6でも標準モードになるから採用されたし <meta charset="UTF-8"> というHTML5の書き方は、従来は以下のように書かなければいけない <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> だけど、IE6でも対応しているから採用された。 IE6が作られた時代に<meta charset="UTF-8">という書き方は存在しなかったのに 何故動作するのか?それはブラウザの間違った記述でも動くおせっかい機能が働いたため <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> http-equiv書き忘れてもOKにしよう <meta content="text/html; charset=UTF-8"> ダブルクォートでくくるの忘れる人もいるんじゃね? <meta content=text/html; charset=UTF-8> content書き忘れてもOKにしよう <meta charset=UTF-8> という謎理論で、たまたま動作していた挙動が仕様となった。 他にも壊れたHTMLの解釈の仕方まで、主流のブラウザの挙動を考慮して仕様が作られた html5.0 見出しは全部h1にしようぜwwwh見出し数えるの面倒なんだよね〜〜www html5.1 ごめん、やっぱ今のナシ 初めて俺が主導したプロジェクト、ひっそりと死亡する 当時は標準がなかった、は本当なのか? CSSが出来たのは1994年 IE1がリリースされたのも1994年 CSS1がW3Cから勧告されたのは1996年12月 提唱、いいだしたのが1994年 CSSに対応したブラウザは、IEが3.0(1996年8月) ネットスケープが4.0(1997年6月) ボタンを押したらDBからデータを取得してテキストファイルに書き込みするって部分を作ってます 書き込む先のテキストファイルは決め打ちにしてたんだけど書き込んで名前をつけて保存、ってこともやりたいなと思うんですがjavascriptで名前を付けて保存のようなダイアログボックスを出すことは可能ですか? >>755 ・ダイアログは可能 ・ファイル名は決められる ・場所はセキュリティ上ほぼできないと思っていい(完全に自分用なら作れる) ダウンロード以降、どこに保存するかはブラウザに任せるしかない 流れとしては、以下のような形 ボタンを押す→ダイアログを出してファイル名をきめさせる→ダウンロード >>756 ありがとうございます 場所は指定出来ないのですね 自分もダウンロードなら出来るのかなと思ってたのですが名前を変更する方法が分からず断念してました Javascriptを触るのが今回初めてなので的外れな質問かもしれませんが、ダイアログを表示させたりするモジュールやパッケージなどが用意されているのでしょうか? >>757 パッケージとかは知らない。多分無いと思う ヘッダ触れるなら以下で実現できる https://ja.stackoverflow.com/questions/32487/ 無理なら ブラウザでボタンを押す、ダイアログを出してファイル名をきめさせる →サーバーでファイル名を受け取り、その名前でファイル生成 →ダウンロード いずれにしろph側の処理が必要で、js単独でやる方法は無いと思う。あったらゴメン >>758 丁寧にありがとうございます 周りに聞ける人もおらず誰か知らない人が作ったものの改良なんで心折れかけてました javascript単体でなんとか完結出来るのかと思って探してたのですが(サーバー側とかの知識がないため)それも難しいようですね 重ねて質問で申し訳ないのですが、セキュリティ上の関係で保存場所の指定ができないというのはどういう意味なのでしょうか? >>759 保存場所の指定ができないというより、PCの中身にアクセスできないと言ったほうが正しい もしブラウザからPCの中身を見る手段があると、サイトを開いた瞬間、サイトの持ち主からPCの中身全部丸見えという事になる で、このセキュリティをガバガバにする方法があるんだけど、 かなりめんどくさい 完全に自分用ならそれは実現できるけどね >>758 > →サーバーでファイル名を受け取り、その名前でファイル生成 そんなことしたら、他人がつけたファイル名とかぶった時に大変なことになるだろ > いずれにしろph側の処理が必要で、js単独でやる方法は無いと思う。あったらゴメン ダウンロード属性を使えばできる https://developer.mozilla.org/ja/docs/Web/HTML/Element/a IEでできるかどうかはよくわからん https://qiita.com/wadahiro/items/eb50ac6bbe2e18cf8813 ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.4 2024/05/19 Walang Kapalit ★ | Donguri System Team 5ちゃんねる