当我们使用SAPUI5的FileUploader控件上传本地文件时,其执行逻辑的入口为FileUploader.prototype.upload:首先判断该控件是否已经被禁用:如果(!this.getEnabled()){返回;}SAPUI5FileUploader底层可以基于表单的multipart/form-data或者XHR技术上传文件,在下面的源码中可以清楚的看到。首先使用getDomRef获取fu_form,即下图这个高亮区域:try{this._bUploading=true;if(this.getSendXHR()&&window.File){varaFiles=this.FUEl.files;如果(bPreProcessFiles){this._sendProcessedFilesWithXHR(aFiles);}else{this._sendFilesWithXHR(aFiles);}}elseif(uploadForm){//为了提交,内部表单的actionDOM属性应该是准确的。//如果传递给uploadUrl属性的字符串发生变化,我们必须确保它在DOM中应用//并在有新的呈现后执行提交。sActionAttr=uploadForm.getAttribute("动作");如果(sActionAttr!==this.getUploadUrl()){this._submitAfterRendering=true;}否则{这个._提交和重置值();}}如果返回的对象实例不为空,则表示使用表单提交本地代码,准备提交文件:_submitAndResetValue调用HTML表单的原生提交方法提交:服务器返回一个File上传好了!字符串:可以在隐藏的iframe中看到此字符串:无法访问this.oIFrameRef.contentWindow.document.body.innerHTML;:错误消息:VM1992:1UncaughtDOMException:阻止了来源为“http://localhost:8080”的框架从访问跨源框架。JavaScript不能用于访问具有不同来源的iframe,以避免任何可能的安全风险。对于同源策略,浏览器会阻止脚本尝试访问不同来源的iframe。事实上,我在8080端口的index.html上下文中无法查看另一个iframe的任何属性,报同样的错误:thatIdetectedinadvancedwhentheiframebeingcreated:theiframejustcreated,hrefisabout:blank:直到这个函数执行完,this.oIFrameRef.contentWindow.location.href处于可访问状态:在beforeRendering的hook中,this.oIFrameRef.contentWindow.location.href仍然可用,但是afterRenderinghook不可用:before和afterRendering钩子将在每次单击Browse...按钮以选择本地文件时触发一次。选择后点击上传按钮,再次触发:点击上传文件后,执行提交前,可以正常访问:this.oIFrameRef.contentWindow.location.hrefpost到3003,然后访问就不行了:
