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(); // 例外処理 }
回答3件
あなたの回答
tips
プレビュー