Not allowed to navigate top frame to data URL,前端页面打开新窗口预览base64数据遇到的问题解决

本文介绍了一种使用Base64编码的文件在前端Vue框架下进行预览和下载的方法,通过创建iframe元素绕过Chrome对DataURI的安全限制。

需求是附件上传功能,
实现方式是将文件的base64存入库中,在需要下载的地方获取这个base64
前端框架用的vue
在下载这个base64文件的时候是没有问题的

<a :href="en.content" :download="en.name">{{ en.name }}</a>

但是如果想跳转新页面打开这个base64,会报以下错误

<a :href="en.content">{{ en.name }}</a>

在这里插入图片描述
原因是Chrome出于安全考虑,禁止从页面打开 Data URI

这边选了一个变通的解决方案

<a style="margin-left:20px" @click="preView(en.content)">预览</a>

还是一个a标签,加一个点击事件

preView (content) {
      var string = content
      var iframe = "<iframe width='100%' height='100%' src='" + string + "'></iframe>"
      var x = window.open()
      x.document.open()
      x.document.write(iframe)
      x.document.close()
    },

点击事件中新建一个iframe,用这个iframe来显示数据。
就可以实现了
在这里插入图片描述
浏览器默认支持的格式都可以预览,如:txt,pdf,图片

### 浏览器安全策略限制 当尝试通过 `audio` 或其他标签加载本地资源时遇到错误提示 “Not allowed to load local resource”,这是因为现代浏览器出于安全性考虑,默认情况下不允许网页直接访问用户的本地文件系统[^1]。 对于开发环境中的测试需求,可以采用以下几种方法绕过此限制: #### 方法一:使用 Web Server 提供静态资源服务 最推荐的方式是在开发环境中配置一个简单的HTTP服务器来提供这些资源。例如利用 Python 自带的 HTTP 服务器模块快速启动服务: ```bash python -m http.server 8080 ``` 这样就可以把原本指向本地路径(如 D:\...)改为相对应的网络地址形式 (http://localhost:8080/) 来引用资源了[^2]。 #### 方法二:调整 Vue CLI 配置 如果项目基于 Vue CLI 构建,则可以在项目的根目录下创建或编辑 `.env.development.local` 文件加入如下设置以允许跨域请求: ``` VUE_APP_BASE_API=http://localhost:9090/ ``` 接着修改 src/config/index.js 中 api 接口的基础 URL 设置为上述变量值,并确保后端也做了相应的 CORS 支持处理。 #### 方法三:临时关闭 Chrome 的安全机制 仅限于调试目的,可以通过命令行参数启动一个新的无沙箱模式实例: ```bash chrome.exe --disable-web-security --user-data-dir="C:/ChromeDev" ``` 注意这种方法只适用于个人开发者用于短期测试用途,不适合生产部署也不建议长期保持这种状态因为存在安全隐患。 ### 实现代码示例 为了更好地理解如何更改资源链接方式,这里给出一段简单示例展示如何在 JavaScript 中动态改变音频源URL: ```javascript const audioElement = document.getElementById('myAudio'); // 将原来的file协议替换成了http(s),并指定了正确的web server路径 audioElement.src = '/static/audio/sample.mp3'; ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值