質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

3188閲覧

JSのlocation.hrefでサーバー側にパラメーターを渡したらrequest too largeのエラーが出てしまいました。

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2016/07/07 01:51

編集2016/07/07 02:25

csvを作成するためにlocation.hrefでurlにパラメーターをつけたところ、request too largeのエラーが出てしまいました。

サーバーサイドはPHPで書いているのですが、非同期通信でCSV出力する方法などはあるのでしょうか?
それとも、同期通信でurlにパラメーターを持たせずにパラメーターを送る方法があるのでしょうか?

最初に非同期通信でやったところ、CSV出力できなかったので、locationを使用しました。

下記がjsのコードになります。

location.href = "example.com/---/csv?sids="+sids+"&departments="+deps+"&manhour_date="+$this.m_ops.manhour_date;
非同期通信 var params = { 'sids':sid_list, 'departments':dep_list, 'manhour_date':$this.m_ops.manhour_date }; export_csv(params, function(res,err){ if(err==null){ }else{ console.log("エラー"); } });

下記がPHPのコードになります。

$sids = explode(",", $params['sids']); // sidsの分割 $departments = explode(",", $params['departments']); try { //CSV形式で情報をファイルに出力のための準備 $csvFileName = 'hoge'.time().'.csv'; header('Content-Type: application/octet-stream'); header("Content-Disposition: attachment; filename=".$csvFileName); $res = fopen('php://output', 'w'); if ($res === FALSE) { throw new Exception('ファイルの書き込みに失敗しました。'); } $sql_pjdata = "SELECT `pname`,`department` FROM hogehoge"; $res_pjdata = db_query($sql_pjdata); $header = ['年月','社員名','部署']; $pj_arr = []; // プロジェクト一覧 $pj_dep_arr = []; // プロジェクトに対する部署一覧 foreach($res_pjdata as $pj_values){ foreach ($pj_values as $key => $value) { if($key == "pname"){ if(!in_array($value, $header)){ array_push($header, $value); array_push($pj_arr, $value); } } } } mb_convert_variables('SJIS-win', 'UTF-8', $header); // 文字コード変換 & エクセルで開けるようにする fputcsv($res, $header); // ファイルに書き出し for($i=0; $i<count($sids); $i++){ // sidに対するデータを取得 $para = []; // 成形したすべてのデータを保存 $sql = "SELECT `sid`,`name`,`department`,`pname`,`percentage`,`psum`,`hour_sum` from manhour_logs where `sid`=:sid and `date` like '".$params['manhour_date']."-%' order by `department`"; $sql_res = db_query($sql, ['sid'=>$sids[$i]]); if(!empty($sql_res)){ $sid = $sql_res[0]['sid']; $name = $sql_res[0]['name']; $department = $sql_res[0]['department']; $pnames = explode(",", $sql_res[0]['pname']); $percentages = []; $count_ave = []; foreach($sql_res as $value){ if($value['percentage'] != null){ $percentages[] = explode(",", $value['percentage']); }else{ $percentages[] = 0; } } $count_ave = count($percentages); $arr_sum = []; for($j=0; $j<count($pnames); $j++){ // foreach($percentages as $per_logs){ $arr_sum[$j] += $per_logs[$j]; } } $contemporary = []; // 一時的に使用する配列 $contemporary['date'] = $params['manhour_date']; $contemporary['sid'] = $sid; $contemporary['name'] = $name; $contemporary['department'] = $department; for($k=0; $k<count($pj_arr); $k++){ $key = "sum".$k; // $contemporaryの合計値を代入 for($l=0; $l<count($pnames); $l++){ if($pj_arr[$k]==$pnames[$l]){ $contemporary[$key] = round(($arr_sum[$l]/$count_ave), 1); continue 2; }else{ $contemporary[$key] = ''; } } } array_push($para, $contemporary); } foreach($para as $dataInfo){ // ループしながら出力 mb_convert_variables('SJIS-win', 'UTF-8', $dataInfo); // 文字コード変換。エクセルで開けるようにする fputcsv($res, $dataInfo); // ファイルに書き出しをする } } fclose($res); // ハンドル閉じる exit; }catch(Exception $e){ echo $e->getMessage(); // 例外処理 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

masaya_ohashi

2016/07/07 01:54

location.hrefを使うということは、csvを構成するためのデータをサーバに送信し、CSVが表示されるページに移動したい、ということでしょうか?
masaya_ohashi

2016/07/07 01:55

「最初に非同期通信でやった」というコードも質問文に追記しておけば参考になるかもしれません。
退会済みユーザー

退会済みユーザー

2016/07/07 02:12

ページ移動ではなく、phpでcsvデータを作成し、出力する形にしています。
kei344

2016/07/07 02:19

例示用ドメインはご自身で所有されていない限りexample.comを利用してください。
masaya_ohashi

2016/07/07 02:22

出力、とはもしかしてファイルでダウンロードさせたいということでしょうか?
退会済みユーザー

退会済みユーザー

2016/07/07 02:27

すいません、ブラウザの下にダウンロードされるのでたぶんダウンロードだと思います。
guest

回答3

0

パラメータを送ってファイルをダウンロードさせるのって「非同期」処理じゃないですよね?
普通にhttpヘッダーを付けて出力してもらえばファイルのダウンロードになると思います。

投稿2016/07/07 02:55

yambejp

総合スコア114839

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/07/07 03:07

ありがとうございます。 参考にさせていただきます!!
guest

0

同期、非同期を問わず、GETで遅れる長さには限界があります(参考)。

それ以上の大きなデータは、POSTで投げましょう(XMLHTTPRequestでもPOSTできますし、「POSTでページ遷移したい」ということならformを生成してそれを送信する形でも大丈夫です)。

投稿2016/07/07 02:09

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/07/07 02:13

非同期ですと、postしてもcsv出力ができずに、返り値として、jsの方に値が帰ってきてしまうのですが...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問