javascriptからCSVファイルをダウンロードできない

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,492

nabex

score 57

ダウンロードボタンを押下した後CSVファイルをダウンロードしたいのですがダウンロード出来ません。
ダウンロードボタンを押すと'msgid':'IZ00005 と表示されるのですが、これはajaxの呼び出しに失敗しているということですか?

// Ajaxを呼び出す (同期)
var ajax = new Ajax.Request(

の記述部分の
postBody     : 'param=' + postJson,

変数postJson にはダウンロードしたいファイルの日付とIDがはいっていることはデバックで確認出来ました。

おそらくダウンロードするファイルのパスがないのが原因だと思うのですが、どのように付け加えたら良いかわかりません。どなたかご教授をお願い致します。

<input id="dl_id[0]" class=" prts_btn_m" type="button" 
tabindex="" onclick="click_download_button({'dl_id':'261','dl_day':'20160706'});" 
value="ダウンロード" name="dl_id[0]">
/*
CSV出力ボタン
*/
function click_download_button(obj)
{
    //clearShw(); // Confirmウィンドウを閉じる

    var dl_day = obj.dl_day;
    var dl_id = obj.dl_id;

    var postArray = new Object();
    postArray['dl_day'] = dl_day;
    postArray['dl_id'] = dl_id;

    $("dl_day").value = dl_day;
    $("dl_id").value = dl_id;

    var postJson = com_toJSONString(postArray);
    //var postJson = JSON.stringify(postArray);

    var url = $('base').value;
    url += '/sample/downloadCheck';

    // Ajaxを呼び出す (同期)
    var ajax = new Ajax.Request(
        url,
        {
            method       : 'post',
            //postBody     : 'json=' + postJson,
            postBody     : 'param=' + postJson,
            asynchronous : false,
            onLoading    : openLoadingWin(com_getMsg({'msgid':'IZ00005',
                                                      'msglist':comMsg})),
            onSuccess    : fileExistsSuccess,
            onFailure    : fileExistsFailure,
            onException  : fileExistsException
        }
    );
public function executeDownloadCheck()
    {
        $this->modelobj = new apedi3u120EntryModel($this->comobj);
        //$json = json_decode($this->req);

        $param = json_decode($this->req['param'], true);
//var_dump($param);
        $result = $this->modelobj->downloadCheck($this, $param['dl_id'], $param['dl_day']);
        $this->output = json_encode($result);

        return 'JSON';
    }
function fileExistsSuccess(httpObj)
{   clearShw(); // Confirmウィンドウを閉じる
    var dl_day = $("dl_day").value;
    var dl_id = $("dl_id").value;

    if(dl_day==0 && dl_id == '' ){

        //SHWcfmobj.close();

        setCfmobjFailure('E0083');    // 対象データがありません。
        return false;
    }

    // リターンパラメータチェック
    var jsonRetVal = httpObj.responseText;

    if(jsonRetVal == null){
        clearShw(); // Confirmウィンドウを閉じる
        //SHWcfmobj.close();

        setCfmobjFailure('E0003');    // 処理が失敗しました
        return false;
    }else{
        var form = document.forms['form1'];
        form.module.value = 'test';

        var p_action = "download";
        var p_base = '/abl/apedi.php';
        var url = p_base + '/test/' + p_action + "?dl_day="+dl_day+"&dl_id="+dl_id;

        window.open(url, '_blank', COMDEF.DEF_WINDOW_OPTIONS);

        form.module.value = "test";
        form.action.value = "list";
        form.submit();

        clearShw(); // Confirmウィンドウを閉じる
        //SHWcfmobj.close();
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • kei344

    2016/07/20 13:43

    「出来ません」とは何がどう「出来ない」のでしょうか。少なくとも関数fileExistsSuccessがわからないとどうやってダウンロードを開始させようとしているかがわかりません。

    キャンセル

  • nabex

    2016/07/20 13:58

    関数fileExistsSuccessを追加しました。ダウンロードボタンを押したときにCSVファイルをダウンロードできないという意味です。

    キャンセル

回答 2

checkベストアンサー

+1

最初に結論: PHPでダウンロードさせるのが良いと思います

ottooさんが書いたように、PHPでダウンロードさせるのが良いと思います。また、現在されている実装ではAjaxで取得した値をもう一度PHPに投げているので、少なくともそこは1手順で実装できると思います。

使用されているのは prototype.js でしょうか。最近のAjaxはネイティブの実装が各ブラウザで共通化されて来ているため、使わなくても実装できると思います。



1: IZ00005 について

ダウンロードボタンを押すと'msgid':'IZ00005 と表示されるのですが、これはajaxの呼び出しに失敗しているということですか?

下記部分は関数com_getMsgを実行した結果を関数openLoadingWinの引数に実行したものを、onLoading に割り当てています。

onLoading    : openLoadingWin(com_getMsg({'msgid':'IZ00005', 'msglist':comMsg})),

 ロード時に関数を実行させたいのであれば、関数名を割り当てるか下記のように無名関数を使用します。

onLoading    : function() { openLoadingWin(com_getMsg({'msgid':'IZ00005', 'msglist':comMsg})); },

 

2: 変数jsonRetVal が使われていない

関数fileExistsSuccess で変数jsonRetVal を準備しながらなにも使っていないので、どちらにせよ一つ目のPHPは意味はありません。

3: window.open が無駄に呼ばれている

下記部分で新しいウィンドウを呼んでいますが、その前後のフォームとは無関係です。(値やフォームの新しいwindowとのやり取りが無い)ちなみにフォームもsubmitしてもデータを渡していないので(動いたとして)毎回同じ結果になります。

window.open(url, '_blank', COMDEF.DEF_WINDOW_OPTIONS);

 【window.open - Web API インターフェイス | MDN】
https://developer.mozilla.org/ja/docs/Web/API/window.open

最近のファイルダウンロードの実装について

window.open でのダウンロードは最近使われなくなっている気がします。(ブラウザによっては制限があるみたいです)

最近の実装であれば、下記のような手法を取ると思います。

【JavaScriptでファイルダウンロード処理を実現する - Qiita】
http://qiita.com/wadahiro/items/eb50ac6bbe2e18cf8813

【javascript - JavaScriptからファイルをダウンロードさせるのはどうしたら良いですか? - スタック・オーバーフロー】
http://ja.stackoverflow.com/questions/300/javascriptからファイルをダウンロードさせるのはどうしたら良いですか

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/07/20 16:55

    ありがとうございます。サイトを参考に自分で出来る部分までやってみます。それでもわからなかった場合は改めて質問させて頂きます。

    キャンセル

+1

回答が意図と外れていたらすみません。
JSON(postJson)をリターンするのではなく、PHPでCSVダウンロードさせてしまえば良いのではないでしょうか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/07/20 13:26

    ありがとうございます。やり方は色々あるので柔軟に考えたほうが良いというのも確かにありますね。ですがこちらの都合でなんとかこのバグを解消したいです。

    調べていたら以下のサイトが参考になりそうなので自分でももちろん良く見てみます。
    http://tricky-code.net/mine/javascript/js02ajax.php

    キャンセル

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

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