corodva Refused to load the font——拒绝加载字体


问题:

Refused to load the font 'data:application/x-font-ttf;base64,AAEAAAAPAIAAAwBwRkZUTXMrDTgAAAD8AAAAHE9T…oNBgQrsQYBRLEkAYhRWLBAiFixBgNEsSYBiFFYuAQAiFixBgFEWVlZWbgB/4WwBI2xBQBEAAAA' because it violates the following Content Security Policy directive: "default-src *". Note that 'font-src' was not explicitly set, so 'default-src' is used as a fallback.

 

这个错误是说

拒绝加载字体,需要在CSP进行配置


 

解决办法:

找到html中的<metahttp-equiv="Content-Security-Policy"> 标签

在content中加入 font-src * data:;

问题解决



<think>我们正在处理浏览器拒绝从 blob URL 加载媒体资源的问题。根据提供的引用,我们可以知道不同浏览器对Blob对象的支持存在差异,特别是在Android浏览器和Safari中。 引用[1]指出,在Android浏览器中,使用new Blob()可能会抛出TypeError,需要使用老版本的BlobBuilder API。而引用[2]则指出Safari中Blob URL在作为图片源时可能无法正确加载。 用户的问题是关于媒体文件(可能是音频、视频等)无法从blob URL加载。我们可以推测,类似的问题也可能发生在媒体元素(如<audio>或<video>)上。 解决方案思路: 1. 对于不支持标准Blob构造函数的浏览器(如旧版Android浏览器),使用BlobBuilder作为回退。 2. 对于Safari,可能存在对blob URL作为媒体源的支持问题,需要检查是否正确地创建了URL,并确保媒体类型正确。 具体步骤: 1. 创建Blob对象时,使用兼容性写法,即先尝试使用标准Blob构造函数,如果不支持则使用BlobBuilder。 2. 创建对象URL后,将其赋给媒体元素的src属性。注意,对于Safari,可能需要检查媒体类型(MIME类型)是否正确,因为不正确的类型可能导致加载失败。 3. 在Safari中,可能还需要注意,blob URL必须在同一源下使用,且不能跨域。 另外,根据引用[2]中的问题,Safari在加载blob URL图片时onload事件不触发,这可能是由于Safari对blob URL的处理机制不同。对于媒体元素,我们可能需要监听媒体元素的`canplay`或`loadeddata`事件,而不是`onload`。 下面是一个通用的创建Blob的兼容函数,以及使用blob URL设置媒体元素src的示例。 注意:由于媒体文件通常较大,我们可能从其他途径(如XMLHttpRequest、File API等)获取二进制数据,然后创建Blob。 兼容性创建Blob的函数: ```javascript function createBlob(parts, options) { var blob; try { blob = new Blob(parts, options); } catch (e) { // 处理TypeError(旧版浏览器) if (e.name === 'TypeError') { // 使用BlobBuilder var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder; if (BlobBuilder) { var builder = new BlobBuilder(); for (var i = 0; i < parts.length; i++) { // 注意:BlobBuilder的append方法参数可以是ArrayBuffer, ArrayBufferView, Blob, 或字符串 builder.append(parts[i]); } blob = builder.getBlob(options ? options.type : undefined); } else { throw new Error("Blob not supported"); } } else { throw e; } } return blob; } ``` 然后,创建对象URL并赋给媒体元素: ```javascript var blob = createBlob([arrayBuffer], { type: 'audio/mp3' }); // 假设是MP3音频 var url = window.URL.createObjectURL(blob); var audio = new Audio(); audio.src = url; audio.play().catch(e => { console.error('播放失败', e); }); ``` 对于Safari,如果媒体资源仍然无法加载,我们需要考虑: 1. 检查MIME类型是否正确。例如,如果是MP3,则类型为'audio/mpeg';如果是MP4,则为'video/mp4'。 2. 确保媒体数据是有效的,因为Safari可能对媒体数据的格式要求更严格。 3. 注意Safari可能不支持某些编解码器。 另外,根据引用[2]中的经验,Safari可能将blob URL解释为相对URL,但这个问题在媒体元素上可能不会出现,因为媒体元素的src属性通常要求绝对URL。不过,我们可以尝试使用完整的URL格式,即使用`window.URL.createObjectURL(blob)`返回的URL已经是绝对URL。 如果问题仍然存在,我们可以尝试使用其他方法,例如将媒体数据转换为Data URL,但注意Data URL有大小限制,不适合大文件。 最后,记得在不使用URL时释放它,以避免内存泄漏: ```javascript // 当媒体元素加载完成并播放结束后,可以释放(但注意不要立即释放,因为可能还需要播放) // 可以在媒体元素不再需要时(例如页面卸载前)释放 window.URL.revokeObjectURL(url); ``` 总结:解决浏览器拒绝从blob URL加载媒体资源的问题,关键在于正确处理Blob创建的兼容性和确保媒体类型正确。同时,针对不同浏览器的特性进行适配。</think>### 解决浏览器拒绝从 Blob URL 加载媒体资源的问题 当浏览器拒绝从 Blob URL 加载媒体资源时,通常是由于浏览器兼容性问题或 Blob 创建方式不当导致的。以下是系统化的解决方案: #### 1. **Blob 创建的兼容性处理** 不同浏览器对 Blob API 的支持存在差异: ```javascript function createMediaBlob(data, mimeType) { try { // 标准现代浏览器 return new Blob([data], { type: mimeType }); } catch (e) { // 兼容旧版浏览器(Android 4.3 等) if (window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder) { const builder = new (window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder)(); builder.append(data); return builder.getBlob(mimeType); } throw new Error("Blob API not supported"); } } // 使用示例 const mediaData = new Uint8Array([...]); // 媒体二进制数据 const blob = createMediaBlob(mediaData, 'audio/mp3'); // 或 video/mp4 ``` #### 2. **Safari 特殊处理** Safari 对 Blob URL 有额外限制: ```javascript const blobUrl = URL.createObjectURL(blob); // 创建媒体元素时添加跨域属性 const audio = new Audio(); audio.crossOrigin = "anonymous"; // 关键设置 audio.src = blobUrl; // 替代方案:使用 <source> 标签 const audioElement = document.createElement('audio'); audioElement.innerHTML = `<source src="${blobUrl}" type="audio/mp3">`; document.body.appendChild(audioElement); ``` #### 3. **MIME 类型验证** 确保媒体类型精确匹配: ```javascript // 常见媒体 MIME 类型 const mimeMap = { mp3: 'audio/mpeg', mp4: 'video/mp4', ogg: 'audio/ogg', webm: 'video/webm' }; // 根据文件扩展名设置类型 const getMimeType = (filename) => { const ext = filename.split('.').pop().toLowerCase(); return mimeMap[ext] || 'application/octet-stream'; } ``` #### 4. **内存管理与错误处理** ```javascript // 使用后释放资源 mediaElement.onended = () => { URL.revokeObjectURL(blobUrl); }; // 错误监听 mediaElement.onerror = (e) => { console.error('媒体加载失败:', e); // 备选方案:转换为 Base64 Data URL const reader = new FileReader(); reader.onload = () => mediaElement.src = reader.result; reader.readAsDataURL(blob); }; ``` #### 5. **浏览器特性检测** ```javascript // 检测 Blob URL 支持性 const isBlobSupported = () => { try { new Audio().src = URL.createObjectURL(new Blob(['test'])); return true; } catch (e) { return false; } }; if (!isBlobSupported()) { // 回退方案:使用服务器代理或 Base64 } ``` ### 关键注意事项 1. **iOS Safari 限制**: Blob URL 必须在用户交互(如点击事件)中创建,否则会被阻止[^1]。 2. **Android 4.x 兼容**: 必须使用 `BlobBuilder` 替代 `Blob` 构造函数[^1]。 3. **媒体格式支持**: 不同浏览器支持的媒体编解码器不同,需测试目标平台: - MP3:所有现代浏览器 - AAC:Safari 必需 - Opus:Firefox/Chrome 4. **CORS 模拟**: 设置 `crossOrigin="anonymous"` 避免 Safari 将 Blob URL 视为跨域资源[^2]。 > **引用说明**: > [^1] Android 旧版浏览器需使用 BlobBuilder API 替代 Blob 构造函数 > [^2] Safari 需设置 `crossOrigin` 属性解决 Blob URL 加载问题 --- ### 相关问题 1. **如何检测浏览器对 Blob 媒体流的支持程度?** 2. **Blob URL 与 Base64 Data URL 在媒体加载中的性能差异?** 3. **Safari 浏览器中还有哪些特殊的媒体加载限制?** 4. **如何实现 Blob 媒体资源的断点续传?** 5. **Web Worker 中创建的 Blob 能否用于主线程的媒体播放?**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值