ExtJS 提交表单以下载文件

3

我很难弄清楚这个问题。我需要在一个ExtJS应用程序中提交表单,然后以.CSV文件下载数据。问题是,ExtJS让我使用“isUpload”提交表单时,我的POST参数被发送为“mulitpart/form-data”,我无法解析它们。我有多个相同输入字段名称的值。

field: A
field: B
field: C

当我提交我的网格时,它们会像上面那样作为多个实例传递。一旦我在表单中引入 "isUpload",它们就会变成以下情况:
field: A,B,C

我的程序将字段读取为"A,B,C"而不是三个独立的字段!

这是我的代码。有趣的是,当我在Firebug中检查Params选项卡时,它看起来是正确的,但POST选项卡将它们全部作为一个值。

我最近刚刚将参数添加到URL中,试图欺骗它!

    Ext.Ajax.request({
        url : '/cgi-bin/cgijson007.pgm' + '?' + parameters,
        form : myForm,
        params : parameters,
        standardSubmit : true,
        isUpload : true
    });
3个回答

2

isUpload: true只是定义您想要上传带有字段的文件,因此multipart是正确的。对于下载,我建议您使用隐藏框架。为此,请使用命名空间内定义的助手。

helper.util.HiddenForm = function(url,fields){
    if (!Ext.isArray(fields))
        return;
    var body = Ext.getBody(),
        frame = body.createChild({
            tag:'iframe',
            cls:'x-hidden',
            id:'hiddenform-iframe',
            name:'iframe'
        }),
        form = body.createChild({
            tag:'form',
            cls:'x-hidden',
            id:'hiddenform-form',
            action: url,
            target:'iframe'
        });

    Ext.each(fields, function(el,i){
        if (!Ext.isArray(el))
            return false;
        form.createChild({
            tag:'input',
            type:'text',
            cls:'x-hidden',
            id: 'hiddenform-' + el[0],
            name: el[0],
            value: el[1]
        });
    });

    form.dom.submit();

    return frame;
}

// Use it like
helper.util.HiddenForm('my/realtive/path', [["fieldname","fieldValue"]]);

如果服务器返回下载内容,将会弹出保存窗口。

2
非常感谢您的快速回复。这个论坛比ExtJS论坛好多了!我将尝试您发布的代码。我希望我可以将我的params变量放入您的语句中。 - Michael Haston
有没有办法“收集”表单字段和值?我已经创建了一个名为“参数”的变量,它的值看起来像这样:field=AS41F1MH.AFF&fieldid=AFF&type=CHAR&text=AFFILIATE&file=MMDF/AS41F1MH AS AS41F1MH&field=DIGITS(AS41F1MH.SSN)&fieldid=SSN&type=NUMERIC&text=SSN&field=AS41F1MH.NAME&fieldid=NAME&type=CHAR&text=NAME&format=CSV - Michael Haston
@MichaelHaston 这是非常快的 var sets = str.split('&'), i = 0, kvSets = []; len = sets.length; for (;i < len; i++) { kvSets.push(sets[i].split('=')); } 使用 kvsets 作为参数。 - sra
抱歉用大写字母,但是...你们太棒了!我已经试图解决这个问题比我想承认的时间更长了!谢谢你们两个。 - Michael Haston
@MichaelHaston 两个?你只是在和一个人交流 ;) 如果答案正确,你应该将其标记为答案并考虑点赞。你获得的点赞越多或者你标记为已回答的问题越多,你就会获得更多的声望。这意味着更多的特权。 - sra
抱歉,我以为原来的回答是另一个用户。谢谢。我会标记这个问题已解决。再次感谢。 - Michael Haston

0

这个完美运作。包括数组。

downloadFile: function (url, params) {
        debugger;
        var body = Ext.getBody(),
            frame = body.createChild({
                tag: 'iframe',
                cls: 'x-hidden',
                id: 'hiddenform-iframe',
                name: 'iframe'
            }),

            form = body.createChild({
                tag: 'form',
                method: 'POST',
                cls: 'x-hidden',
                id: 'hiddenform-form',
                action: url,
                target: 'iframe'
            });

        for (var i in params) {

            if (Ext.isArray(params[i])) {
                for (var j = 0; j < params[i].length; j++) {
                    form.createChild({
                        tag: 'input',
                        type: 'hidden',
                        cls: 'x-hidden',
                        id: 'hiddenform-' + i,
                        name: i,
                        value: params[i][j]
                    });
                }
            } else {

                form.createChild({
                    tag: 'input',
                    type: 'hidden',
                    cls: 'x-hidden',
                    id: 'hiddenform-' + i,
                    name: i,
                    value: params[i]
                });
            }

        }

        form.dom.submit();

        return frame;
    }

0
以下是我如何处理网格列表上的帖子下载:
首先,我创建一个包含要发布的参数的隐藏字段的HTML表单容器,以及一个提交函数。
var txtFileId = Ext.create('Ext.form.field.Hidden', { name: 'fid', value: 0 });
var dwFrm = Ext.create('Ext.container.Container', {
  autoEl: { tag: 'form',  method: 'POST', target: '_BLANK', 
    action: '/download/files' }, style: { hidden: true },
  items: [txtFileId, {
    xtype: 'hidden', name: 'userId', value: '1111'
  }],
  submit: function (fid) {
    if (fid) {
      txtFileId.setValue(fid);
      this.el.dom.submit();
    }
  }
});

其次,我将上述组件停靠在网格的工具栏中

var grid = Ext.create('Ext.grid.Panel', {
  .....
  dockedItems: [Ext.create("Ext.Toolbar", {
    dock: "top", items: [
      dwFrm, 
      { text: "Download Selected",
        handler: function () {
          var sm = grid.getSelectionModel();
          if (!sm.hasSelection()) return null;
          var recs = sm.getSelection();
          dwFrm.submit(recs.data.id);
        }
      }
    ]
  })]
  .....
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接