ajaxUpload异步上传文件成功,前端获取数据却失败的解决方案
2017-12-04 16:22
721 查看
背景: 我们团队现在在做一个电商项目的时候,前后端分离的方式开发,有些页面要用到异步上传图片的技术来提高用户体验性。
我先来简要概述一下我们的技术方案:
后台框架: ssm
后台服务器: tomcat+nginx+apache
前端框架: jquery,vue,ajaxUpload,bootStrap
现在前端页面有一个上传头像的位置
前后端分离方式开发,我们的前端页面在前端服务器里,后台程序在后台程序服务器里,两个服务器不一样,所以ip不同。
这时前端的哥们使用ajaxUpload来上传图片到我们的后端服务器里,代码片段:
**前端的哥们上传之后图片上传成功了的,但是前端报了异常,我们很纳闷
响应成功后的数据:,我们确保是上传成功了的**
但是前端报错了:
Uncaught DOMException: Blocked a frame with origi
4000
n “null” from accessing a cross-origin frame.
这个错误导致了我们弄了好久,毕竟第一次用异步上传,网上查找了很多资料都没得到能解决的方案,报错依旧在。
直到我查看了ajaxUpload源码后才发现解决办法:
ajaxUpload源码> https://github.com/carlcarl/AjaxFileUpload/blob/master/ajaxfileupload.js
告诉我们异步上传的实现是通过在当前页面动态创建一个iframe,iframe里再根据我们提交的信息再创建一个Fom表单,如图所示:
造成错误的原因是因为iframe同源策略的问题,因为前端页面在前端服务器里,它的ip假设为 pageIp,刚开始动态创建的iframe的domain跟父页面的是一致的,但是我们表单提交的地址是后台程序所在的地方,ip为webIp,当iframe里的Form提交后,页面变成了
http://webIp/xxxx了,不再是http://pageIp了(当然,这一步我们是看不到的,ajaxUpload封装了),当请求成功后,ajaxUpload要处理success回调方法来获取ifram的最终数据,也就是上面第3张图的json数据.
ajaxUpload.js获取iframe里的json数据的源码片段:
因为domain不同了,所以ajaxUpload获取不到后台返回来的json数据,所以抛出异常:
Uncaught DOMException: Blocked a frame with origin “null” from accessing a cross-origin frame.
解决办法:
因为前端有PHP环境,所以我叫前端的哥们写个PHP,名字为imageCallBack.php来接收参数值,然后再转成json来echo(不再由我们java后台来直接返回json数据了)。这样保证了ip一致,默认domain一致(当然这个PHP可以用jsp啥的代替的,要跟前端页面同个服务器,当然,解决办法不止这一个,还会有其他的。所以希望有更好的解决办法可以贴出来)。
后台哥们则在java的controller层方法处理完后,将参数(resultCode,resultDesc,savePath,correct参数)携带好,然后重定向到http://pageIp/frontPage/common/imageCallBack.php.(http://pageIp/frontPage是前端网站所在位置),所以前端上传了文件后,json数据在该地址处输出.
OK,问题解决完毕.这个棘手问题算是解决了
我先来简要概述一下我们的技术方案:
后台框架: ssm
后台服务器: tomcat+nginx+apache
前端框架: jquery,vue,ajaxUpload,bootStrap
现在前端页面有一个上传头像的位置
前后端分离方式开发,我们的前端页面在前端服务器里,后台程序在后台程序服务器里,两个服务器不一样,所以ip不同。
这时前端的哥们使用ajaxUpload来上传图片到我们的后端服务器里,代码片段:
**前端的哥们上传之后图片上传成功了的,但是前端报了异常,我们很纳闷
响应成功后的数据:,我们确保是上传成功了的**
但是前端报错了:
Uncaught DOMException: Blocked a frame with origi
4000
n “null” from accessing a cross-origin frame.
这个错误导致了我们弄了好久,毕竟第一次用异步上传,网上查找了很多资料都没得到能解决的方案,报错依旧在。
直到我查看了ajaxUpload源码后才发现解决办法:
ajaxUpload源码> https://github.com/carlcarl/AjaxFileUpload/blob/master/ajaxfileupload.js
告诉我们异步上传的实现是通过在当前页面动态创建一个iframe,iframe里再根据我们提交的信息再创建一个Fom表单,如图所示:
造成错误的原因是因为iframe同源策略的问题,因为前端页面在前端服务器里,它的ip假设为 pageIp,刚开始动态创建的iframe的domain跟父页面的是一致的,但是我们表单提交的地址是后台程序所在的地方,ip为webIp,当iframe里的Form提交后,页面变成了
http://webIp/xxxx了,不再是http://pageIp了(当然,这一步我们是看不到的,ajaxUpload封装了),当请求成功后,ajaxUpload要处理success回调方法来获取ifram的最终数据,也就是上面第3张图的json数据.
ajaxUpload.js获取iframe里的json数据的源码片段:
因为domain不同了,所以ajaxUpload获取不到后台返回来的json数据,所以抛出异常:
Uncaught DOMException: Blocked a frame with origin “null” from accessing a cross-origin frame.
解决办法:
因为前端有PHP环境,所以我叫前端的哥们写个PHP,名字为imageCallBack.php来接收参数值,然后再转成json来echo(不再由我们java后台来直接返回json数据了)。这样保证了ip一致,默认domain一致(当然这个PHP可以用jsp啥的代替的,要跟前端页面同个服务器,当然,解决办法不止这一个,还会有其他的。所以希望有更好的解决办法可以贴出来)。
后台哥们则在java的controller层方法处理完后,将参数(resultCode,resultDesc,savePath,correct参数)携带好,然后重定向到http://pageIp/frontPage/common/imageCallBack.php.(http://pageIp/frontPage是前端网站所在位置),所以前端上传了文件后,json数据在该地址处输出.
OK,问题解决完毕.这个棘手问题算是解决了
相关文章推荐
- javascript发送表单文件,ajax异步,不刷新页面上传PDF文件,并写入数据库,得到异步数据,提示上传成功或失败
- webuploader上传文件后的回调处理,jquery插件webuploader上传成功后怎么获取文件数据-百度webuploader教程9
- ASP.NET MVC上传文件成功返回Json格式数据弹出下载框解决方案
- struts2 + ajax(由前台的form提交数据到后台,再根据form所调用返回获取的后台json格式的数据返回到前端,然后前端用jquery对json数据进行解析)==》》涉及文件上传的部分
- Form表单上传文件,上传成功后获取返回数据
- Asp.Net 上传大文件专题(3)--从请求流中获取数据并保存为文件[上]
- commons-io在struts框架中无法获取upload.parseRequest(request)上传的文件解决方案
- http上传文件格式数据时失败
- struts1.0文件上传获取文本域值乱码解决方案
- 前端文件上传,struts2后台返回json数据,在IE为什么会以文件下载的形式打开。
- Microsoft Jet 数据库引擎找不到对象(上传.zip的文件,先解压后获取数据)
- 关于使用shiro做权限 上传文件失败的问题 解决方案
- web上传文件,并获取返回数据
- kindeditor上传文件在SpringMVC中servletFileUpload.parseRequest(request)解析为空获取不到数据问题 .
- Asp.Net 上传大文件专题(3)--从请求流中获取数据并保存为文件[下]
- 如何通过表单上传图片数据,PHP后端获取并且保存文件数据
- Asp.Net 上传大文件专题(3)--从请求流中获取数据并保存为文件[下]
- uploadify在火狐下上传文件失败解决方案
- servlet文件上传2——复合表单提交(数据获取和文件上传)
- 文件上传到服务器并获取文件中的数据