您的当前位置:首页>全部文章>文章详情

【前端】前端实现文件下载自动打开预览的解决方法

CrazyPanda发表于:2024-05-18 17:05:20浏览:297次TAG:

问题:

前端使用React开发,想要下载阿里云OSS存储的视频文件,使用了<a>标签,点击后就会在浏览器打开预览,具体原因这里不再多说,查找到了几个解决办法,在此记录一下。

一、 下载文件的三种通用方式

1、使用iframe实现

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

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分钟之后删除
    setTimeout(() => {
      iframe.remove();
    }, 5 * 60 * 1000);
  }

2、使用a标签

downloadFile = ((fileurl, filename) => { 
        //fileurl文件地址(一般是接口返回) filename文件下载后的名字
        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);    // 然后移除
 
    });
 const downloadFile = (fileurl,filename) => { //fileurl文件地址(一般是接口返回)
       const a = document.createElement("a");
       a.style.display = "none";
       a.href = fileurl;
       a.download = filename || ""; //需要把这行加上,告诉浏览器是下载行为 ,可以传空
       document.body.appendChild(a);
       a.click();
       document.body.removeChild(a);
   
    };

3、使用form表单

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、vue、js中是通用的,我是参考第二种方法使用的,直接在a标签onclick事件里面写

<a
            onClick={() => {
              // url 文件地址
              fetch(url)
                .then((res) => res.blob())
                .then((blob) => {
                  // 将链接地址字符内容转变成blob地址
                  const link = document.createElement('a');
                  link.href = URL.createObjectURL(blob);
                  link.download = record?.name || '';
                  link.target = '_blank';
                  document.body.appendChild(link);
                  link.click();
                  link.remove();
                })
                .catch(() => {
                  //alert('下载文件失败');
                });
            }}
          >
            下载
          </a>

二、Blob简介

Blob 对象表示一个不可变、原始数据的类文件对象。它的数据可以按文本或二进制的格式进行读取,也可以转换成 ReadableStream 来用于数据操作。

Blob() 

构造函数返回一个新的 Blob 对象。blob 的内容由参数 array 中给出的值串联而成

new Blob(array, options)
参数 
options[可选] 一个可以指定以下任意属性的对象: 
    type 可选,MIME类型 默认值是空字符(“”)。 
    endings 可选,非标准 默认值 transparent 会将换行符复制到 blob 中而不会改变它们。要将换行符转换为主机系统的本地约定,请指定值 native。

URL.createObjectURL()

URL.createObjectURL() 静态方法会创建一个 DOMString,其中包含一个表示参数中给出的对象的 URL。

这个 URL 的生命周期和创建它的窗口中的 document 绑定。这个新的 URL 对象表示指定的 File 对象或 Blob 对象。

参数 
object 用于创建 URL 的 File 对象、Blob 对象或者 MediaSource 对象。

返回值 
一个DOMString包含了一个对象 URL,该 URL 可用于指定源 object的内容。


URL.revokeObjectURL()

URL.revokeObjectURL() 静态方法用来释放一个之前已经存在的、通过调用URL.createObjectURL() 创建的 URL 对象。 

当你结束使用某个 URL 对象之后,应该通过调用这个方法来让浏览器知道不用在内存中继续保留对这个文件的引用了。

猜你喜欢

【前端】支付宝和微信小程序普通二维码跳转二合一
业务需要:系统支持微信小程序和支付宝小程序,现在要扫码跳转到对应小程序,要使用一个二维码,并能携带业务参数,用户使用微信扫码,就能打开微信小程序并获取参数,使用支付宝扫码,就能打开支付宝小程序,并获取参数一、 微信小程序普通二维码跳转实现1、在微信公众平台-开发管理-开发设置中找到【扫描普通链接二维码打开小程序】去配置二维码链接地址2、配置要求二维码规则:配置为二维码对应的链接,其中最后要加/,这样才可以动态传参。扫描后面参数不同的二维码都能跳转。这样类似与测试链接中&nbsp;https:
发表于:2024-03-07 浏览:278 TAG:
【前端】全栈软件开发工程师需要具备哪些技能
全栈软件开发工程师需要具备前端、后端和数据库等多方面的技能,以便能够在整个应用开发周期中承担各种任务。以下是典型的全栈软件开发工程师的技能栈:一、前端技能:1.HTML/CSS/JavaScript:构建网页的基本技能,负责页面结构、样式和交互。2.前端框架:掌握至少一种前端框架,如 React.js、Vue.js、Angular,用于构建可维护的、高性能的前端应用。3.前端工具:使用构建工具(Webpack、Parcel)、包管理工具(npm、Yarn)、代码规范工具(ESLint、Prett
发表于:2023-12-07 浏览:344 TAG:
【前端】2023年最流行的10款前端UI框架排名
&nbsp; &nbsp; &nbsp; &nbsp; 上次我们发布了《2022年最流行的11款PHP框架》,争议很大!今天我们来继续探讨一下:2023年最流行的10款前端UI框架排名。一:前端UI框架是什么?前端UI框架是一种基于HTML、CSS、JavaScript等前端技术的开发工具集,提供了一系列的UI组件、样式、布局等基础功能,使得前端开发人员可以更加高效地开发出具有良好用户体验的Web应用。二:为什么要使用前端UI框架?前端UI框架可以大大减少前端开发人员的工作量,提高开发效
发表于:2023-12-06 浏览:410 TAG:
【HTML】html使用高德地图设置考勤范围
需求:系统需要考勤功能,并在WEB端设置考勤范围,用于员工手机端再次范围内打卡签到,WEB端需要设置考勤地点以及考勤范围。1 使用高德地图开发首先需要再高德开放平台注册账号,并创建应用,获取高德地图key以及安全秘钥这里需要用到地图定位,一级地理坐标转换,使用高德开放平台JSAPI开发。HTML引入js,安全秘钥配置一定要写在js上方:&lt;script&gt; &nbsp;&nbsp;&nbsp;&nbsp;window._AMapSecurityConfig&nbsp;=&nbsp;{ &amp;
发表于:2024-02-07 浏览:362 TAG:
【HTML】箩筐地图的使用,设置考勤范围
接上篇【PHP】html使用高德地图设置考勤范围,项目换掉了高德地图,替换成了箩筐地图,继续实现考勤打卡范围设置。需求:系统需要考勤功能,并在WEB端设置考勤范围,用于员工手机端在此范围内打卡签到,WEB端需要设置考勤地点以及考勤范围。 上篇高德地图已经实现了此功能,现在要换成箩筐地图实现此功能 基本思路:绘制地图-&gt;根据地址获取坐标-&gt;根据坐标绘制圆形范围-&gt;根据半径自适应显示圆形范围1 箩筐地图箩筐地图开放平台https://testlbs.luokuang.com/ 同样
发表于:2024-02-07 浏览:868 TAG:
【前端】html Antv L7 + mapbox 实现3D地图 3D中国地图 不限于中国地图
echarts的3D地图实在太丑了,还一堆bug使用阿里的Antv可视化库L7,实现3D地图,底图是mapbox 参考示例:https://l7.antv.antgroup.com/zh/examples/polygon/3d#floatMap如果不需要底图样式,可把Scene的style设置为blank 直接上代码了,vue的就不说了,项目是html的mapbox依赖&lt;script&nbsp;src=&#39;https://api.mapbox.com/mapbox-gl-js/v2.
发表于:2024-01-18 浏览:448 TAG:
【HTML】必应地图BingMaps的使用
又换新地图了,之前换了箩筐地图,效果不能满足实际需要,这次换成了必应地图BingMaps,同样实现设置考勤区域的功能,效果还是挺不错的。相关阅读【HTML】html使用高德地图设置考勤范围&nbsp;【HTML】箩筐地图的使用,设置考勤范围一、&nbsp;获取应用KEY还是老样子,先注册账号,然后获取key。注册参考官方说明https://www.bingmap.cn/guide/db765008-dafe-11e8-a995-d46d6d978bfa?module=doc,这里不再过多说明。
发表于:2024-02-19 浏览:382 TAG:
【Html】H5跳转支付宝小程序的两种方式
H5跳转支付宝小程序的两种方式,第一种方式还可以打开支付宝生活号网页,只是换成appid换成网页应用appid,page参数换成url参数,url对应的是自己页面的链接
发表于:2024-03-28 浏览:360 TAG:
【前端】快速了解 ES6 新增字符串方法,开箱即用(含案例)
文章目录📋前言🎯includes() 方法🎯startsWith() 方法🎯endsWith() 方法🎯repeat() 方法🎯padStart() 方法🎯padEnd() 方法🎯trim() 方法🎯trimStart() 或 trimLeft() 方法🎯trimEnd() 或 trimRight() 方法🎯replaceAll() 方法🎯slice() 方法🎯substring() 方法🎯split() 方法🎯charAt() 方法🎯charCodeAt() 方
发表于:2023-12-10 浏览:326 TAG:
【前端】前端网络安全
今天思考下前端源码安全的东西(不是前端安全,只是针对于源码部分)。在我看来,源码安全有两点,一是防止抄袭,二是防止被攻破。实际上讲,前端的代码大多是没有什么可抄袭性,安全更是形同虚设的(任何前端输入都是不能相信的)。但如果还是想防止源码被查看,HTML、CSS并不能做什么,最终都会用露出来(最简单用Chrome开发者工具就可以看到),所以只能针对JS做文件的压缩合并和混淆。关于抄袭其实就前端来讲,代码没有什么好抄袭的,大多人都是抄UI设计(这个是躲不了),还有一些富前端的控件和算法,重要之处还是
发表于:2024-03-17 浏览:335 TAG: