4

これに少し関連する質問を見たことがありますが、私の問題に答えるものはありません。Ext.Ajax.request を次のように設定しました。

var paramsStringVar = 'param1=1&param2=two&param3=something&param4=etc';

Ext.Ajax.request({
  url: '/cgi-bin/url.pl',
  method:'POST',
  params:paramsStringVar,
  timeout:120000,
  success: function(response, opts){
    var objhtml = response.responseText; //content returned from server side
    console.log(objhtml);
  }

});

このリクエストは、バックエンドから適切なコンテンツを取得します。パラメータの 1 つは outputType で、{html、excel、csv} の値を取ることができます。html を表示に戻すと、正しく処理して表示することができます。さて、問題に...

outputType パラメーターを csv または Excel に設定すると、要求に応じて適切なコンテンツが csv または tsv(excel) として返されます。しかし、コンテンツは必要ありません。ファイル (csv または Excel) をダウンロードするプロンプトが必要です。extjs 内のテキスト コンテンツを取得するだけでなく、ファイルをダウンロードするようにブラウザに自動的に促すにはどうすればよいですか?

バージョン 4.07 なので、4.1 のみの機能は使用できません

4

4 に答える 4

7

完全な解決策はないようですが、私が試すいくつかのアプローチがあります。

1)iframe実際のXHRの代わりにを使用して、データをサーバーにPOSTします。たとえば、非表示のiframeのは<form action="/something" target="myiframe">どこですか。そうすれば、フォームは (メイン ウィンドウではなく) iframe を使用して、構成された URL にデータを送信します。ブラウザーがダウンロードをトリガーするように、サーバーは応答ヘッダーを(またはバイナリ データのその他の MIME タイプ) に設定する必要があります。それ以外の場合 (html が返された場合)、iframe の body innerHTML を取得して、UI でユーザーに表示することができます。XHR の代わりに iframe (または新しいウィンドウ) を使用することは最善のアイデアのようには思えませんが、このソリューションはこれまでのところ最も信頼性が高いようです (そして最高のブラウザー サポートを備えています)。myiframenameapplication/octet-stream

Ext.form.Basic docs ページの例を少し変更したものを次に示します。

Ext.create('Ext.form.Panel', {
    title: 'Basic Form',
    renderTo: Ext.getBody(),
    width: 350,

    // Any configuration items here will be automatically passed along to
    // the Ext.form.Basic instance when it gets created.

    // *THIS* makes the form use a standard submit mechanism, not XHR
/**/standardSubmit: true,

    // URL to submit to
    url: 'save-form.php',

    items: [{
        fieldLabel: 'Field',
        xtype: 'textfield',
        name: 'theField'
    }],

    buttons: [{
        text: 'Submit',
        handler: function() {
            // The getForm() method returns the Ext.form.Basic instance:
            var form = this.up('form').getForm();
            if (form.isValid()) {
                // Submit the Ajax request and handle the response
                form.submit({
                    success: function(form, action) {
                       Ext.Msg.alert('Success', action.result.msg);
                    },
                    failure: function(form, action) {
                        Ext.Msg.alert('Failed', action.result.msg);
                    },

                    // You can put the name of your iframe here instead of _blank
                    // this parameter makes its way to Ext.form.Basic.doAction() 
                    // and further leads to creation of StandardSubmit action instance
/**/                target: '_blank'                        
                });
            }
        }
    }]
});

ここには 2 つの重要なパラメーターがあります ( でマークされた行/**/)。

  1. standardSubmit: trueconfig をフォームに渡すと、XHR ではなく標準の送信が行われます。
  2. targetフォームの送信アクションにパラメーターを渡します。この機能は文書化されていませんが、Ext.form.action.Submitソース コードで使用されていることがわかります ( Ext.form.Basic.submit()メソッドに渡すすべてのオプションは、最終的に Ext.form.action. * 実例。

サンプルコードでは、target: '_blank'すぐに機能することを示すために入れました (新しいブラウザーウィンドウが作成されます)。後で iframe の名前に置き換えることができますが、最初にフォームがデータを通常の新しいウィンドウに送信する方法をテストしてから、iframe を作成して処理するロジックを開発することをお勧めします。自分で iframe 内の結果を処理する必要があると思いました。それほど難しいことではありません。iframe処理の例としてExt.data.Connection.upload()の実装を参照してください。

ExtJS は、実際iframeにファイルのアップロードにすでにこの手法を使用しています。どのように機能するかについてはExt.data.ConnectionExt.form.field.Field.isFileUpload()を参照してください。

2)ここで提案: HTML5/Javascript を使用してファイルを生成および保存します

iframe の方法を使用したくない場合は、応答データからデータ URIを生成し、ダウンロードをトリガーするその URI に移動してみてください。

content = "Hello world!";
uriContent = "data:application/octet-stream," + encodeURIComponent(content);
window.location.href = uriContent;

繰り返しますが、ここでは MIME タイプが不可欠です。これは私にとってはうまくいきましたが、ブラウザがデータ URI にサイズ制限を課していることに注意してください (256Kb が安全な賭けです)。

3)前述のスレッドの別の回答は、(放棄された?)w3仕様を実装するFileSaver.jsライブラリへのリンクです。使用方法とデモはこちら. [BlobBuilder] を使用して、いくつかの方法のいずれかを使用してダウンロードを初期化するためにさらに使用されるバイナリ データのブロブを生成します。このソリューションは機能しているように見えますが、非推奨の API を使用しているため、将来的に保証されない可能性があります。

于 2012-08-02T20:19:42.917 に答える
6

以下は私の解決策です。これが私が現在機能している方法です。応答は、テキスト/ csvの応答タイプに基づいて、ダウンロード/オープンプロンプトを生成します。iFrameやiframeへの参照は必要ないことに注意してください。私はiFrameの必要性に多くの時間を費やしましたが、それは実際に私のソリューションを壊しました。ダウンロードプロンプトを生成するためにiFrameは必要ありません。必要なのは、これに似たリクエスト(送信)と、テキスト/csv応答ヘッダーを使用して適切なcsvを生成するバックエンドです。

var hiddenForm = Ext.create('Ext.form.Panel', {
  title:'hiddenForm',
  standardSubmit: true,
  url: /cgi-bin/url.pl
  timeout: 120000,
  height:0,
  width: 0,
  hidden:true,
  items:[
    {xtype:'hiddenField', name:'field1', value:'field1Value'},
    // additional fields
  ]
})

hiddenForm.getForm().submit()

standardSubmit行は重要です

于 2012-08-07T19:56:43.860 に答える
0

ExtJS 3.4 で動作させるには:

        var hiddenForm = new Ext.FormPanel({
            id:'hiddenForm',
            region: 'south',
            method: 'POST',
            url: "/cgi/test.wsgi",
            height: 0,
            standardSubmit: true,
            hidden:true,
            items:[
                {xtype:'hidden', name:'p', value:p},
                {xtype:'hidden', name:'g', value:g},
                // ...
            ],
        });

        linkThis = new Ext.Button({
            text: 'Download this CSV',
            handler: function() {
                hiddenForm.getForm().submit();
            },
            maxHeight: 30,
        });

機能させるには、hiddenForm を任意のコンテナ (つまり、ボタンの同じ Ext.Window) に配置する必要があることに注意してください。次に例を示します。

  risultatiWindow = new Ext.Window({
            title: 'CSV Export',
            height: 400,
            width: 500,
            ....
            items: [...., hiddenForm]
 });
于 2015-06-24T09:29:11.780 に答える
0

You don't need to create a form panel and make it hidden in your extjs file. We can add a html form and on click of button in extjs file we can submit the form using the url. This will work both in IE as well as chrome browsers. Below is my code i tried and its working fine,

<form action="<%=fullURL%>/DownloadServlet.do" method="get" id="downloadForm"   name="downloadForm" target="_self">
</form>

click: 
  {
     fn: function()
    { 
       document.getElementById('downloadForm').submit();    
    }
  }   
于 2013-11-13T05:22:22.277 に答える