react、vue、js实现文件下载导出(iframe,form,a标签)

news/2024/6/15 2:27:26 标签: javascript, vue.js, react.js

项目中用到下载导出功能实现:

 第一、二、三种方法是通用方法,vue\react\js都可以使用,当然也有react专用的(实际上是react的方法实现)。

一般都是从接口获取到文件地址,然后调用下面的方法即可,如果下载多个文件就只能循环调用了。

第一种方法:

 iframe实现

只需要传一个文件下载地址的url即可 

javascript">downloadFile = (url) => {//下载方法
    console.log(url)
    const iframe = document.createElement("iframe");
    iframe.style.display = "none"; // 防止影响页面
    iframe.style.height = 0; // 防止影响页面
    iframe.src = url;
    document.body.appendChild(iframe); // 这一行必须,iframe挂在到dom树上才会发请求
    // 5分钟之后删除(onload方法对于下载链接不起作用,就先抠脚一下吧)
    setTimeout(() => {
      iframe.remove();
    }, 5 * 60 * 1000);
  }

第二种方法:

a标签

javascript">downloadFile = ((fileurl, filename) => { //fileurl文件地址(一般是接口返回) filename文件下载后的名字
        console.log("3333")
        var a = document.createElement('a');
        a.download = filename; //下载后文件名
        a.style.display = 'none';
        var blob = new Blob([fileurl]);  // 字符内容转变成blob地址 二进制地址
        a.href = URL.createObjectURL(blob);
        document.body.appendChild(a);
        a.click();                        // 触发点击
        document.body.removeChild(a);    // 然后移除

    });

第三中方法:

form表单

javascript">exportCallBack = (fileUrl) => {
        var bodyElement = document.body; //获取body
        var divElement = document.createElement("div"); //创建div
        var downloadUrl = fileUrl; //文件地址
        divElement.innerHTML = `<form action=${downloadUrl} method="post" id="formBox"></form>` //form标签
        bodyElement.appendChild(divElement); //追加到body
        document.getElementById("formBox").submit(); //自动提交表单
        bodyElement.removeChild(divElement); //移除form
    }

react里专用的方法(显得很鸡肋):

这个方法很麻烦,需要先引入

javascript"> import ReactDOM from "react-dom";

然后再项目中跟组件加上这一行或者在使用的组件,render里加上这一行

<div id="exportBoxBank"></div>

javascript">exportCallBack = (fileUrl) => {
        var divElement = document.getElementById('exportBoxBank'); //获取div  也可以用ref获取
        var downloadUrl = fileUrl; //文件地址
        ReactDOM.render(<form action={downloadUrl} method="post" id="formBox"></form>, divElement);
        document.getElementById("formBox").submit(); //自动提交表单
        ReactDOM.unmountComponentAtNode(divElement) //ReactDOM.unmountComponentAtNode()方法,参数为一个结点,调用方法会卸载该容器中的渲染
    }

大致的伪代码:

javascript">import React, { Component } from 'react';
import ReactDOM from "react-dom";

class Index9 extends Component {
    exportCallBack = (fileUrl) => {
        var divElement = document.getElementById('exportBoxBank'); //获取div  也可以用ref获取
        var downloadUrl = fileUrl; //文件地址
        ReactDOM.render(<form action={downloadUrl} method="post" id="formBox"></form>, divElement);
        document.getElementById("formBox").submit(); //自动提交表单
        ReactDOM.unmountComponentAtNode(divElement) //ReactDOM.unmountComponentAtNode()方法,参数为一个结点,调用方法会卸载该容器中的渲染
    }
    exportFile=()=>{//点击导出
      //一般都是先请求接口获取到文件地址然后调用事件(涉及跨域的使设置用代理解决)
      this.exportCallBack(url);
    }
    render() {
        return (
            <div>
                
                <button onClick={exportFile}>导出</button>
                {/* 放到末尾 */}
                <div id="exportBoxBank"></div> 
            </div>
        );
    }
}

export default Index9;


http://www.niftyadmin.cn/n/1557713.html

相关文章

EXC_BAD_ACCESS异常 _block_invoke 问题

EXC_BAD_ACCESS异常 _block_invoke 问题 参考 http://blog.csdn.net/dqjyong/article/details/22511643 这个帖子 ###贴下报错图 ###代码背景 在接入JHL蓝牙的过程中,我使用一个ViewController类 来作为这个蓝牙的管理类 (父类是视图控制器ViewController) 当我在主界面Orde…

Java入门--配置环境

这两天在学习java&#xff0c;记录一下学习过程。学习一门语言首先要搭建其运行环境和编辑器。 配置环境 这个直接照着菜鸟教程的步骤就行菜鸟教程java环境配置流程 编辑器 我用的是Eclipse IDE for Java Developers - Latest Release官网下载地址或者可以用Notepad

vSphere克隆虚机重启网卡报错

使用VMware vSphere克隆虚机&#xff0c;修改IP重启网卡报错&#xff1a; 解决报错&#xff1a; 修改 /etc/udev/rules.d/70-persistent-net.rules 文件&#xff0c;克隆后会多出eth2和eth3两个网卡&#xff0c;删除原先的eth0和eth1,把eth3修改为eth0,eth2修改为eth1 保存退出…

iOS 批量打包脚本 转

http://app.cqjrpay.com:8080/kfb1/download/QuickPos.ipa 给iOS工程增加Daily Build http://blog.devtang.com/2012/02/16/apply-daily-build-in-ios-project/ 就是通过itms-services协议来安装ipa&#xff0c; 用items-service协议通过网站发布iOS应用 http://lxneng.co…

java基本数据类型及变量的声明和注意事项

基本数据类型 JAVA中一共有八种基本数据类型&#xff0c;他们分别是 byte、short、int、long、float、double、char、boolean 类型型别字节取值范围byte整型1byte-27 ~ 27-1short整型2byte-215 ~ 215-1int整型&#xff08;默认&#xff09;4byte-231 ~ 231-1long整型8byte-26…

弹出框透明背景(超简单实现)

弹出框透明背景(超简单实现)需求背景 需要在页面中弹出一个view,背景颜色是灰黑色透明效果,上面展示另外一个view 问题困扰 单纯设置view的alpha值,会导致另外这个view的alpha同样改变,达不到效果 见图 解决办法 在xcode中 找到Background 选项,设置背景view的颜色,注意,…

MySQL 扩展知识

2019独角兽企业重金招聘Python工程师标准>>> 不停库不锁表在线主从配置 mysql主从常见问题 mysql主从延迟 深入探究主从延迟 mysql主从不同步如何做 mysql 主主 mysql-proxy 实现读写分离 mycat实现读写分离 atlas相关 mysql一主多从 mysql环形主从 coba…

cesium圆形扫描、雷达扫描(一般用于预警)

最近再做eact-cesium项目来预警了在地图上其经纬度闪烁&#xff0c;找了好久才找到方法&#xff08;当然是别人封装的&#xff09;。 效果图 /***圆形扩大扫描圈* */function AddCircleScanPostStage(viewer, cartographicCenter, maxRadius, scanColor, duration) {var ScanSe…