【问题标题】:ExtJS 6 - How to upload a file without using form?ExtJS 6 - 如何在不使用表单的情况下上传文件?
【发布时间】:2017-06-18 19:34:44
【问题描述】:

Ext JS 提供了fileuploadfield 绑定了一个按钮来浏览本地文件。我只需要在从本地选择文件后立即使用它上传文件,而不是使用提交按钮来触发发布过程。找不到在选择文件后触发的事件。

附言实际上,我使用的版本是 Ext JS 6,但我认为基于以前版本的解决方案也可以。

【问题讨论】:

标签: extjs extjs4 extjs5 extjs6 extjs6-classic


【解决方案1】:

表格不是必需的。您可以使用 AJAX 和 FormData。

var file = s.fileInputEl.dom.files[0],
    data = new FormData();

data.append('file', file);

Ext.Ajax.request({
   url: '/upload/files',
   rawData: data,
   headers: {'Content-Type':null}, //to use content type of FormData
   success: function(response){ }
});

在线演示here

【讨论】:

    【解决方案2】:

    如果您想提交文件,您需要使用表单。即使您希望该按钮位于工具栏中,您也可以将其包含在一个表单中,它仍然看起来像一个普通的工具栏按钮(您需要为此指定正确的 ui 配置)。

    例子:

    dockedItems: [{
        dock: 'top',
        xtype: 'toolbar',
        items: [{
            xtype: 'form',
            padding: '10 0 0',
            url: 'submit/image',
            items: {
                xtype: 'filefield',
                buttonOnly: true,
                width: 100,
                buttonConfig: {
                    text: 'Add logo',
                    width: '100%',
                    ui: 'default-toolbar-small'
                },
                listeners: {
                    change: function (filefield) {
                        filefield.up('form').submit();
                    }
                }
            }
        }, {
            text: 'Remove logo'
        }, '-', {
            text: 'Discard changes'
        }]
    }]
    

    工作小提琴示例:https://fiddle.sencha.com/#view/editor&fiddle/1pdk

    【讨论】:

      【解决方案3】:

      虽然我同意scebotari's answer,但在您的情况下,在工具栏中嵌入表单可能是最简单的解决方案,为了回答原始问题:

      如果您真的不能或不想使用表单并且您不受浏览器支持的限制,请查看FileReader

      这个想法是在客户端(JavaScript)读取文件内容,然后使用常规 AJAX 请求发送数据。

      您的代码可能如下所示:

      function (fileField) {
          var file = fileField.fileInputEl.dom.files[0],
              reader;
      
          if (file === undefined || !(file instanceof File)) {
              return;
          }
      
          reader = new FileReader();    
          reader.onloadend = function (event) {
               var binaryString = '',
                   bytes = new Uint8Array(event.target.result),
                   length = bytes.byteLength,
                   i,
                   base64String;
      
               // convert to binary string
               for (i = 0; i < length; i++) {
                   binaryString += String.fromCharCode(bytes[i]);
               }
      
               // convert to base64
               base64String = btoa(binaryString);
      
               Ext.Ajax.request({
                   url: 'save-file.php',
                   method: 'POST',
                   params: {
                       data: base64String
                   }
               });
          };
      
          reader.readAsArrayBuffer(file);
      }
      

      【讨论】:

      • 好地方,感谢您的贡献,但由于我们尚未将 AJAX 请求配置为多部分请求,因此收到了异常 MultipartException: The current request is not a multipart request
      • 那似乎是您服务器端的配置/实现细节。我现在不在 ExtJS 6 上,所以我不确定 Ext.Ajax 与 method: 'POST' 一起使用哪种 Content-Type,但您应该能够使用浏览器的开发人员工具检查请求。
      【解决方案4】:

      您正在文件上传字段中查找事件change

      代码可能如下所示:

      Ext.create('Ext.form.Panel', {
          renderTo: Ext.getBody(),
          title: 'Upload Panel',
          items: [{
              xtype: 'filefield',
              name: 'photo',
              fieldLabel: 'Photo',
              labelWidth: 50,
              msgTarget: 'side',
              allowBlank: false,
              anchor: '100%',
              buttonText: 'Select Photo...',
              listeners: {
                  change: function (me, value, eOpts) {
                      console.log('trigger upload of file:', value);
                  }
              }
          }],
      });
      

      小提琴https://fiddle.sencha.com/#view/editor&fiddle/1pd2

      【讨论】:

      • 但这仍然取决于form submission - 我不使用formfile upload field 只是我的 toolbar 的一个项目。
      猜你喜欢
      • 1970-01-01
      • 2016-03-12
      • 2010-09-16
      • 2011-04-09
      • 2011-02-02
      • 2013-08-26
      • 2020-04-03
      相关资源
      最近更新 更多