【前端】前端实现文件下载自动打开预览的解决方法
CrazyPanda发表于:2024-05-18 17:05:20浏览:289次
问题:
前端使用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 对象之后,应该通过调用这个方法来让浏览器知道不用在内存中继续保留对这个文件的引用了。
猜你喜欢
- 【前端】如何使用Redis和TypeScript开发高性能计算功能
- 如何使用Redis和TypeScript开发高性能计算功能概述:Redis是一个开源的内存数据结构存储系统,具有高性能和可扩展性的特点。TypeScript是JavaScript的超集,提供了类型系统和更好的开发工具支持。结合Redis和TypeScript,我们可以开发出高效的计算功能来处理大数据集,并充分利用Redis的内存存储和计算能力。本文将介绍如何利用Redis和TypeScript开发高性能计算功能,包括数据存储、数据处理和结果缓存等方面。我们将使用Redis的常用数据结构和命令,并
- 【前端】前端网络安全
- 今天思考下前端源码安全的东西(不是前端安全,只是针对于源码部分)。在我看来,源码安全有两点,一是防止抄袭,二是防止被攻破。实际上讲,前端的代码大多是没有什么可抄袭性,安全更是形同虚设的(任何前端输入都是不能相信的)。但如果还是想防止源码被查看,HTML、CSS并不能做什么,最终都会用露出来(最简单用Chrome开发者工具就可以看到),所以只能针对JS做文件的压缩合并和混淆。关于抄袭其实就前端来讲,代码没有什么好抄袭的,大多人都是抄UI设计(这个是躲不了),还有一些富前端的控件和算法,重要之处还是
- 【前端】微信小程序跳转公众号的三种方式
- 最近因为项目需要,要在小程序页面添加按钮,点击跳转公众号对应页面,目前没有直接点击按钮从小程序跳转到公众号页面的方法,但也有变相的实现方法,最后采用小程序webview内嵌公众号页面的方法来实现相关功能,在此记录一下:相关参考:小程序跳转公众号的三种方法 | 微信开放社区 (qq.com)开放能力 / official-account (qq.com)方法: 1: 公众号组件<official-account></official-account>
- 【前端】2023年最流行的10款前端UI框架排名
- 上次我们发布了《2022年最流行的11款PHP框架》,争议很大!今天我们来继续探讨一下:2023年最流行的10款前端UI框架排名。一:前端UI框架是什么?前端UI框架是一种基于HTML、CSS、JavaScript等前端技术的开发工具集,提供了一系列的UI组件、样式、布局等基础功能,使得前端开发人员可以更加高效地开发出具有良好用户体验的Web应用。二:为什么要使用前端UI框架?前端UI框架可以大大减少前端开发人员的工作量,提高开发效
- 【HTML】 html 初始化执行方法
- HTML的初始化执行方法有多种。以下是其中几种常见的方式: 1. JavaScript的DOMContentLoaded事件:当页面加载完成并且所有元素都已经被创建时,会触发该事件。可以通过在JavaScript文件或者内联script标签中编写相应的函数来处理这个事件。示例如下:document.addEventListener("DOMContentLoaded", function() { // 在此处添加需要执行的代
- 【Html】H5跳转支付宝小程序的两种方式
- H5跳转支付宝小程序的两种方式,第一种方式还可以打开支付宝生活号网页,只是换成appid换成网页应用appid,page参数换成url参数,url对应的是自己页面的链接
- 【前端】前端实现文件下载自动打开预览的解决方法
- 问题:前端使用React开发,想要下载阿里云OSS存储的视频文件,使用了<a>标签,点击后就会在浏览器打开预览,查找到了几个解决办法,在此记录一下。一、 下载文件的三种通用方式1、使用iframe实现只需要传一个文件下载地址的url即可 downloadFile = (url) => { //下载方法 console.log(url)
- 【前端】微信小程序推送订阅消息
- 业务需要,商城类小程序,要在用户下单支付成功后,推送消息通知用户。首先想到的是小程序模板消息,微信公众号模板消息已经用过很多了,小程序模板消息确是第一次做。小程序模板消息 参考https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/template-message.html 小程序模板消息在2020年已经改版了,现在推送模板消息都会推送到服务通知里面,
栏目分类全部>