2012-04-21 14 views
0

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

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が、結果はそれぞれ異なることになるだろう送っによってserver.In上の静的ファイル私の場合は、参照します時間。私はresult.responseTextで望むエクセルファイル全体を返す。ダイアログボックスがポップアップしてユーザーにオプションとして保存を要求するためには、何をする必要がありますか?また、どのようにdomhelperのsrcを設定するべきかわからない。どんな助けでも本当に感謝しています。

答えて

1

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

+0

これは私に多くの感謝を助けました。私はContent-Dispositionに関する問題を抱えていた – RTF

2

私は完全にクライアントにとらわれない方法でこれを行う唯一の方法は、Content-Type of:octect-streamとContent-Disposition of 'attachment'を推奨ファイル名で使用してサーバー側から強制することです。参照:

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

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

あなたはまた、いわゆる 'dataURIs' を使用することができますが、彼らは問題の独自のセットがあります。

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

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

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

+0

サーバー側はすでにうまく動作していて、言及した正確なヘッダーを持つExcelファイルを返すだけです。そのダイアログボックスは私が望むダイアログボックスです。ボタンからJSONデータをポストする方法は? content-typeは '' application/json''に必要ですか? – Armaan

+0

また、JSONはエクスポートボタンのイベントハンドラに組み込まれています。このボタンは、質問に投稿されたコードも含まれています。 JSONデータは、エクスポートボタンがクリックされるたびに作成する必要があります。これは、グリッドを含むタブパネルが2つあり、jsonがそのグリッドを構築するために選択された特定のパラメータで構築されたアクティブなタブに基づいています。 – Armaan

+0

私が正しく理解しているならば、特定のグリッドコンポーネントの店舗からデータを取り出し、JSONとして投稿してオクテットストリームやwhat-have-youの返答を返す必要があります。したがって、最初の部分では、Modelオブジェクトのインスタンスを手渡すExt.Store.getRangeを使用し、送信するAjaxリクエストにparamsオプションを使用して、これらのrecをリクエストJSONのパラメータとして設定します。 参照: http:// stackoverflow。com/questions/2526764/how-to-retrieve-json-data-array-from-extjs-store および http://stackoverflow.com/questions/2917581/how-to-post-json-data-with- extjs – omnisis