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

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

ただいまの
回答率

88.04%

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,768
退会済みユーザー

退会済みユーザー

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(); // 例外処理
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • kei344

    2016/07/07 11:19

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

    キャンセル

  • masaya_ohashi

    2016/07/07 11:22

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

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2016/07/07 11:27

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

    キャンセル

回答 3

checkベストアンサー

0

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/07 12:07

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

    キャンセル

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/07 11:13

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

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る