iframe 父子页面之间的相互通信-文件上传(react-angular)_iframe怎么把file文件传给父级-程序员宅基地

技术标签: react  

最近在处理这样一个项目,react使用iframe嵌套了一个angular项目,现在想让两者进行通信实现一个上传的功能。

看到这个需求是不是有点一脸茫然,硬着头皮上吧。我会按照我的业务流程叙述我是如何实现的。

  • 父页面 是react 写的
  • 子页面 是angular写的
  • 接下来的叙述均为父子页面
1:子页面调用父页面方法

子页面方法:

 window.parent.postMessage(传递参数, "*");

父页面方法:

window.addEventListener(
      'message',
      function(e) {
       console.log(e.data)
      },
      false,
    );

传递的数据会在e.data中,如果你的项目中需要多个地方用到这个方法建议在传递的参数中增加识别变量,用来区分具体是干什么的。

在react中把这个方法放在componentDidMount即可

2:子页面给父页面传递文件对象

在实际的开发过程中发现,通过这种方法是无法直接传递文件对象的,具体报错就不再展示了。
再加上文件对象不能通过JSON.stringify转换成字符串,所以只能转换成base64 格式
转换方法如下:

var reader = new FileReader(); //实例化文件读取对象
        reader.readAsDataURL(fileItem._file); //将文件读取为 DataURL,也就是base64编码
        let dataURL = null;
        reader.onload = function (ev) {
          //文件读取成功完成时触发
          dataURL = ev.target.result; //获得文件读取成功后的DataURL,也就是base64编码
          // console.log(dataURL);
          window.parent.postMessage({ base: dataURL, comer: "上传文件" }, "*");
        };
3:父页面接收参数并转码

如果你只需要使用base64即可完成业务那这一步是没有必要的
这个方法会先把base64转换成BolB格式,在转换成file格式

componentDidMount() {
    // 得到B传来的值
    const _this = this;
    window.addEventListener(
      'message',
      function(e) {
        if (e.data.comer === '上传文件') {
          _this.changeBaseToFile(e.data.base);
        }
      },
      false,
    );
  }
  
// 把base64转换成文件
  changeBaseToFile = base64String => {
    console.log(base64String)
    const base64ToBlob = function(base64Data) {
      let arr = base64Data.split(','),
        fileType = arr[0].match(/:(.*?);/)[1],
        bstr = atob(arr[1]),
        l = bstr.length,
        u8Arr = new Uint8Array(l);

      while (l--) {
        u8Arr[l] = bstr.charCodeAt(l);
      }
      return new Blob([u8Arr], {
        type: fileType,
      });
    };
    // blob转file
    const blobToFile = function(newBlob, fileName) {
      newBlob.lastModifiedDate = new Date();
      newBlob.name = fileName;
      return newBlob;
    };

    const blob = base64ToBlob(base64String);
    const file = blobToFile(blob, '图片');
  };

4:通知子页面上传状态,和相关数据

上传的具体实现因为每个项目的需求不一样所以我就不再赘述,我们用的是自己封装的组件而且还是在私库。

获取到上传请求后返回的数据需要告知子页面,子页面还需展示。

父页面:

// 调用angular的方法
  onAngularFun =(fileList) =>{
    document.getElementById('iframe的ID').contentWindow.postMessage({fileData: fileList, comer:'上传文件'},"*");
  }

子页面:

$scope.getReactImage = () => {
      window.addEventListener(
        "message",
        function (e) {
          if (e.data.comer === "上传文件") {
            $scope.changeProdPictures(e.data.fileData)
          }
        },
        false
      );
    };
    $scope.getReactImage();

其中$scope.changeProdPictures(e.data.fileData)就是拿到数据后的处理逻辑了,不再赘述。

以上方法似乎在跨域的情况下也能使用,多说一句,angular这边拿到数据后更新自己的图片数组但是渲染并未刷新,在方法的最后加上$scope.$apply();即可,也只是可能, 我的这样写是可以的,你们的不一定。对angular不懂,所以只能受之与鱼了。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43827462/article/details/111932152

智能推荐

可狱可囚的爬虫系列课程 07:BeautifulSoup4(bs4)库的使用_beautifulsoup4库 获取br-程序员宅基地

文章浏览阅读1.5k次,点赞21次,收藏18次。BeautifulSoup4 属于 BeautifulSoup 系列的第四代版本,BeautifulSoup 是一个可以从 HTML 或 XML 文件中提取数据的 Python 库,这个库能够实现树文档的导航、查找,从而帮助我们提取到网页中所需要的数据。。如果忘记了在哪里安装,请回看 Requests 模块第一篇文章。安装好以后,我们围绕数据提取这个话题对 BeautifulSoup4 进行剖析。"""# 问题一:使用标签选择器获取源代码中所有的 p 标签。_beautifulsoup4库 获取br

rpm包及作用_cannot install both libpng-2:1.5.13-8.el7.x86_64 a-程序员宅基地

文章浏览阅读1.9k次。基于Red Hat Enterprise Linux Server release 7.4 (Maipo)最小化安装将会慢慢补齐每个包的作用:1 bash-completion-2.1-6.el7.noarch https://cbs.centos.org/koji/rpminfo?rpmID=4260 2 grubby-8.28-23.el7.x86_64 ..._cannot install both libpng-2:1.5.13-8.el7.x86_64 and libpng-2:1.6.37-1.ky10.

vxworks的RTP学习_vxworks rtp-程序员宅基地

文章浏览阅读2.1k次。这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Ma..._vxworks rtp

用户层与驱动通信-程序员宅基地

文章浏览阅读185次。以进行加法和减法为例,用户层将要进行的操作码和参数,返回缓冲发给驱动,驱动进行处理并将结果写到返回缓冲中driver.c//_stdcall#include<ntddk.h>#include<ntstrsafe.h>#pragma code_seg("INT")#define SynLinkName L"\\??\\freesec_tx..._pirpstack->majorfunction

Android Framework 分析-程序员宅基地

文章浏览阅读91次。http://raymond1860.spaces.live.com/Blog/cns!BF47B6FD104579C9!797.entry1.目录树/framework/base/api/framework/base/awt/framework/base/build/framework/base/camera关 于camera的HAL接口库。最终生成native共享库l..._android framework cmds 开发

springboot+mysql互联网互联网美食分享平台源码53102-程序员宅基地

文章浏览阅读82次。免费领取项目源码,请关注●点赞收藏并私信博主,谢谢-、互联网美食分享平台采用Java技术,Mysql数据库存储数据,基于Springboot框架开发。系统采用了模块化设计方法,根据用户的需求开发功能模块,方便了程序扩展维护,以便后期的更新。整个开发过程首先对系统进行需求分析,得出系统主要功能模块。接着对系统进行总体设计和详细设计。最后对系统进行了功能测试,并对测试结果进行了分析总结,得出系统的不足及需要改进的地方,为以后的系统维护提供了方便,同时也为以后开发类似系统提供了借鉴和帮助。

随便推点

E - Mafia CodeForces - 348A 【二分】_348a二分-程序员宅基地

文章浏览阅读317次。E - Mafia CodeForces - 348A 【二分】One day n friends gathered together to play “Mafia”. During each round of the game some player must be the supervisor and other n - 1 people take part in the game. Fo..._348a二分

四元数和旋转矩阵_四元数 旋转矩阵-程序员宅基地

文章浏览阅读1.6w次。四元数和旋转矩阵Quaternion(四元数)Quaternion 的定义四元数一般定义如下: q=w+xi+yj+zk其中 w,x,y,z是实数。同时,有: i*i=-1 j*j=-1 k*k=-1四元数也可以表示为: q=[w,v]其中v=(x,y,z)是矢量,w是标量,虽然v是矢量,但不能简_四元数 旋转矩阵

WebComponents.exe未安装的解决办法-程序员宅基地

文章浏览阅读5.8w次,点赞6次,收藏3次。很多人在使用海康威视的开发包的时候,都会遇到下面几个问题在安装WebComponents.exe之后 浏览器在运行的时候提示WebComponents.exe为安装 或者是WebComponents.exe不是最新版本开发包提供的版本如下,浏览器自动安装的版本为3.0.5.34这2个版本都是是可以使用的 ,而且不需要更新那么问题就在浏览器了_webcomponents.exe

集成测试与系统测试_集成测试是系统测试吗-程序员宅基地

文章浏览阅读1.4w次,点赞5次,收藏42次。 集成测试与系统测试_集成测试是系统测试吗

Jenkins中文官网地址_jenkins官网-程序员宅基地

文章浏览阅读792次,点赞9次,收藏8次。Jenkins 是一个开源自动化服务器。Jenkins 用户手册。_jenkins官网

nginx 网页匹配跳转(rewrite、location)_nginx location直接指向某个网页-程序员宅基地

文章浏览阅读1.7k次,点赞29次,收藏23次。location,rewrite基于:域名、客户端ip、旧域名、参数匹配,跳转_nginx location直接指向某个网页

推荐文章

热门文章

相关标签