Ext.Direct File Upload - Form submit of type appli

2019-09-06 09:05发布

问题:

I am trying to upload a file through a form submit using Ext.Direct, however Ext.direct is sending my request as type 'application/json' instead of 'multipart/form-data'

Here is my form.

 {
        xtype: 'form',
        api: {
            submit: 'App.api.RemoteModel.Site_Supplicant_readCSV'
        },
        items: [
            {
                xtype: 'filefield',
                buttonOnly: false,
                allowBlank: true,
                buttonText: 'Import CSV'
            }
        ],
        buttons:
        [
            {
                text: 'Upload',
                handler: function(){
                    var form = this.up('form').getForm();
                    if(form.isValid()){
                        form.submit({
                            waitMsg: 'Uploading...',
                            success: function(form, action){
                                console.log(action.result);
                            }
                        });
                    }
                }
            }
        ]
    },

On the HTTP request, it checks to see if the request options is a form upload.

if (me.isFormUpload(options)) {

which arrives here

isFormUpload: function(options) {
    var form = this.getForm(options);       
    if (form) {
        return (options.isUpload || (/multipart\/form-data/i).test(form.getAttribute('enctype')));
    }
    return false;
},

getForm: function(options) {
    var form = options.form || null;
    if (form) {
        form = Ext.getDom(form);
    }
    return form;
},

However, options looks like this

{
callback: function (options, success, response) {
jsonData: Object
    action: "RemoteModel"
    data: Array[1]
        0: form
        length: 1
         __proto__: Array[0]
        method: "Site_Supplicant_readCSV"
        tid: 36
        type: "rpc"
    __proto__: Object
scope: constructor
timeout: undefined
transaction: constructor
}

And there is no direct form config, but it exists in jsonData.data[0]. So it doesn't set it as type multipart/form-data and it gets sent off as type application/json. What am I doing wrong? Why isn't the form getting submitted properly?

Edit - I am seeing a lot of discussion about a 'formHandler' config for Ext.Direct? I am being led to assume this config could solve my issue. However I don't know where this should exist. I'll update my post if I can find the solution.

Solution - Simply adding /formHandler/ to the end of the params set the flag and solved my issue. Baffled.

Supplicant.prototype.readCSV = function(params,callback, request, response,   sessionID/*formHandler*/)
{
    var files = request.files;
    console.log(files);
};

回答1:

The method that handles file upload requests should be marked as formHandler in the Ext.Direct API provided by the server side.

EDIT: You are using App.api.RemoteModel.Site_Supplicant_readCSV method to upload files; this method needs to be a formHandler.

I'm not very familiar with Node.js stack but looking at this example suggests that you may need to add /*formHandler*/ descriptor to the function's declaration on the server side.