Ext JS 6.7不能跨域上傳文件的bug

因爲要使用表單實現跨域上傳文件,但是發現在6.7居然不行,需要自己手動去創建FormData對象來提交,這比較奇怪。經過分析源代碼,終於找到了這個bug,主要代碼如下:

			...
            if (Ext.feature.has.XHR2 && request.xhr2) {
                delete request.form;
                var formData = request.data = new FormData(form);
                if (request.params) {
                    Ext.iterate(request.params, function(name, value) {
                        if (Ext.isArray(value)) {
                            Ext.each(value, function(v) {
                                formData.append(name, v);
                            });
                        } else {
                            formData.append(name, value);
                        }
                    });
                    delete request.params;
                }
            }
            return Ext.Ajax.request(request);
    

以上代碼是Ext.form.PanelbeforeAjaxSubmit代碼片段,主要錯誤是在創建FormData的時候把值賦值給了data屬性,而不是rawData屬性,這導致了在Ext.AjaxsetOptions方法中把表單值都忽略了,從而什麼也沒提交。

通過重寫Ext.form.PanelbeforeAjaxSubmit方法,就可使用以下代碼輕鬆的跨域上傳文件了:

            view.submit({
                xhr2:true,
                headers:{
                    "Content-Type": null
                },
                method: 'POST',
                submitEmptyText: false,
                url: URI.get(CFG.organizationUnit.id === 1 ? 'shareProduct': 'product', 'import'),
                success: me.onSubmitSuccess,
                failure: me.onSubmitFailure,
                scope: me
            });

代碼中,xhr2是必須的,從剛纔的代碼也可以看到,只有當該值爲true的時候,纔會使用FormData對象來提交數據,而這是使用Ajax來上傳文件的常用方式。另外一個要注意的地方就是要將Content-Type設置爲null,以便自動生成正確的Content-Type,不然提交也不會成功。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章