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

Posted 上将军

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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,不然提交也不会成功。

以上是关于Ext JS 6.7不能跨域上传文件的bug的主要内容,如果未能解决你的问题,请参考以下文章

cors跨域H5 js跨域上传文件,C#服务端接收

用webuploader怎么解决跨域上传文件的问题

Ext Js 6.2.1 classic grid 滚动条bug解决方案

界面上传文件js包AjaxUpload.js

百度ueditor能不能上传pdf

WebApi2 文件图片上传下载