0

ユーザーがグリッドをExcelにエクスポートできるようにするためのグリッドとボタンを含むアプリケーションがあります。サーバーが Excel ファイルで応答したときに、[名前を付けて保存] ダイアログ ボックスを表示できるようにしたいと考えています。サーバーはパラメーターを JSON オブジェクトとして受け入れます。これが私のコードです:-

Ext.Ajax.request({
   url: '/export/excel/',
   method: 'POST',
   //Send the query as the message body
   jsonData: jsonStr,
   success: function (result,request) {
        Ext.DomHelper.append(document.body, {
           tag: 'iframe',
            frameBorder: 0,
            width: 0,
            height: 0,
            //src:result,
            css: 'display:none;visibility:hidden;height:1px;'
        });
    }, //success
    failure: function (response, opts) {
        var msg = 'server-side failure with status code: ' + response.status + ' message: ' + response.statusText;
        Ext.Msg.alert('Error Message', msg);
    }
});

同様の質問 ( ExtJS AJAX save as dialog box ) があることは知っていますが、それはサーバー上の静的ファイルを参照しています。私の場合、送信された json に応じて、結果は毎回異なります。result.responseText に必要な Excel ファイル全体を取得します。ユーザーにオプションとして保存を求めるダイアログ ボックスがポップアップ表示されるようにするには、何をする必要がありますか? また、srcdomhelper をどのように構成する必要があるのか​​ わかりません。どんな助けでも本当に感謝しています。

4

2 に答える 2

2

完全にクライアントに依存しない方法でこれを行う唯一の方法は、Content-Type の octect-stream と Content-Disposition の 'attachment' と提案されたファイル名を使用して、サーバー側から強制することだと思います。見る:

http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html#sec19.5.1

http://www.ryboe.com/tutorials/php-headers-force-download

いわゆる「dataURI」を使用することもできますが、これらには独自の問題があります。

http://en.wikipedia.org/wiki/Data_URI_scheme

サーバー上で動的に EXCEL コンテンツを返し、ボタンをその URL へのリンクにして、作業中の現在のデータを投稿し、正しい応答ヘッダーを設定してブラウザーにファイルのダウンロードをトリガーすることをお勧めします。AJAX 呼び出しを行っており、Web ブラウザーに URL を直接取得させないため、ブラウザーがコンテンツを解釈する方法を制御するために設定した HTTP ヘッダーは問題になりません。これは、ユーザーのブラウザーではなく JS で実行しているためです。サーバー上のリンクを介してコンテンツをユーザーに直接返すことで、この問題を回避できます。

実際にはユーザーにリンクをクリックしてもらいたいので、ここでは AJAX は適切ではないと思います。

于 2012-04-22T02:17:46.337 に答える
1

応答でファイルを添付ファイルとして送信するのではなく、サーバー側でファイルが作成および保存された場所のパスを返すようにしたため、応答でヘッダーを設定する問題を回避しました。次に、コード内の iframe のソースを、応答で返されるパスに設定するだけです ( result.responseText)。

于 2012-04-24T19:11:22.483 に答える