ExtJS 6 - Como enviar um ficheiro sem usar o formulário?

o Ext JS fornece fileuploadfield que está junto com um botão para navegar em arquivos locais. Eu só preciso fazer upload de um arquivo usando assim que ele é selecionado a partir local, em vez de usar um botão enviar, a fim de desencadear o processo de post. Não foi possível encontrar um evento que é disparado após a selecção do ficheiro.

P. S. Na verdade, a versão que uso é Ext JS 6 mas acho que as soluções baseadas em versões anteriores também fazem o trabalho.

Author: talha06, 2017-02-02

4 answers

Terá de usar um formulário se quiser enviar o ficheiro. Mesmo que você queira que o botão esteja numa barra de ferramentas, você poderá envolvê-lo num formulário e ele irá continuar a parecer um botão normal da barra de ferramentas (você terá de indicar a configuração da ui apropriada para isto).

Exemplo:

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'
    }]
}]
Exemplo de violino: https://fiddle.sencha.com/#view/editor&fiddle/1pdk
 4
Author: scebotari66, 2017-02-02 09:39:38

A forma não é necessária. Você pode usar AJAX e 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){ }
});

Demo Online aqui

 4
Author: khmurach, 2017-07-10 15:19:39

Embora concorde com a resposta do scebotari que, no seu caso, incorporar um formulário na barra de ferramentas é provavelmente a solução mais fácil, para responder à pergunta original:

Se você realmente não pode ou não quer usar um formulário e não está limitado em relação ao suporte do navegador, dê uma olhada no FileReader .

A ideia é ler o conteúdo do ficheiro do lado do cliente (JavaScript) e, em seguida, enviar os dados usando um pedido AJAX regular.

O seu o código pode parecer assim:

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);
}
 3
Author: matt, 2017-05-23 12:10:46

Está à procura do evento Mudança no campo FileUpload.

O código pode ser assim:

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);
            }
        }
    }],
});
A A A A A A A A https://fiddle.sencha.com/#view/editor&fiddle/1pd2
 1
Author: pagep, 2017-02-01 22:54:45