【问题标题】:ExtJS submit form to download fileExtJS 提交表单以下载文件
【发布时间】:2014-10-16 06:33:23
【问题描述】:

很难弄清楚这一点。我需要在 ExtJS 应用程序中提交表单,然后将数据下载到 .CSV 文件中。问题是,ExtJS 让我使用“isUpload”提交表单的方式是,我正在发布的参数是作为“mulipart/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
    });

【问题讨论】:

    标签: javascript ajax extjs extjs4


    【解决方案1】:

    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"]]);
    

    如果服务器回答下载,则会弹出保存窗口。

    【讨论】:

    • 非常感谢您的快速回复。这个论坛比 ExtJS 论坛好多了!我将尝试您发布的代码。我希望我可以将我的 params 变量放入您的语句中。
    • 有没有办法让我“收集”表单字段和值?我已经做的是一个名为“参数”的变量,它的值看起来像这样: 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
    • @MichaelHaston 这真的很快var sets = str.split('&'), i = 0, kvSets = []; len = sets.length; for (;i < len; i++) { kvSets.push(sets[i].split('=')); } 使用 kvsets 作为参数。
    • 对不起帽子,但是……你们太棒了!试图解决这个问题的时间比我承认的要长!谢谢你们。
    • @MichaelHaston 两个?您只是在和一个人交谈;)如果答案是正确的,您应该将其标记为答案并考虑投票。您获得的赞成票或标记为已回答的问题越多,您获得的声誉就越高。这意味着更多的特权。
    【解决方案2】:

    以下是我如何处理网格列表上的后下载:

    首先,我创建一个带有隐藏字段的 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);
            }
          }
        ]
      })]
      .....
    });
    

    【讨论】:

      【解决方案3】:

      这非常有效。包括数组。

      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;
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-10
        • 1970-01-01
        • 2014-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多