Angular $sce 阻止了我的音频 blob src

Posted

技术标签:

【中文标题】Angular $sce 阻止了我的音频 blob src【英文标题】:Angular $sce blocking my audio blob src 【发布时间】:2013-11-12 19:37:27 【问题描述】:

我正在尝试将角度 ngRepeat 与 html5 音频标签一起使用。 我有html:

    <li ng-repeat="recordings in recordinglist">
        <audio controls ng-src="recordings"></audio>
   </li>

和js:

    $scope.$apply($scope.recordinglist.push("blob:http%3A//localhost%3A9000/67ecfa65-3394-45a6-8f29-42f3421a2727"));

但是 angular 的同源检查导致插值出错:

Error: [$interpolate:interr] Can't interpolate: recordings
Error: [$sce:insecurl] Blocked loading resource from url not allowed by $sceDelegate policy.  URL: blob:http%3A//localhost%3A9000/67ecfa65-3394-45a6-8f29-42f3421a2727

这看起来很愚蠢。它不是插入本地资源。我想有办法正确地做到这一点 - 还是我应该提交错误报告?

【问题讨论】:

你试过用$sce.trustAsResourceUrl()包裹你的网址吗? 这有什么更新吗?你找到解决办法了吗?我也有类似的问题。 我作弊了。它用于一些原型设计,所以我只是把它放在 .config '$sceProvider.enabled(false);' 【参考方案1】:

我的 blob 图片也遇到了类似的问题...试试这个:

基本上它允许 src 中的任何 blob 图像

app.config( ['$compileProvider', function($compileProvider)   
  $compileProvider.imgSrcSanitizationWhitelist(/^\s*(blob):/);

  // another sample to allow diffrent kinds of url in <a>
  // $compileProvider.urlSanitizationWhitelist(/^\s*(https?|ftp|mailto):/);
]);

【讨论】:

【参考方案2】:

我之前尝试为 webrtc 视频显示 blob src 时遇到了同样的问题,我通过使用 $sce 服务修复了它:

angular.module('moduleName', ['ngSanitize'])
.controller('ctrName', ['$sce', function($sce) 
  $scope.recordings = $sce.trustAsResourceUrl(recordings);
])

您也可以check the doc here。

【讨论】:

【参考方案3】:

对我来说,以下解决了问题:

$sce.trustAsResourceUrl

请参阅带有更详细说明的 SO 问题here

【讨论】:

【参考方案4】:

解决此问题的最佳方法是创建可信过滤器。

app.filter('trusted', ['$sce', function ($sce) 
return function(url) 
    return $sce.trustAsResourceUrl(url);
;]);

并且在 ng-src 中使用这个过滤器。

<li ng-repeat="recordings in recordinglist">
    <audio controls ng-src="recordings |trusted"></audio></li>

【讨论】:

这违背了 SCE 的全部目的。最好禁用它,而不是创建一个任何 html 都可以恶意注入页面的过滤器。【参考方案5】:

从文件阅读器获取 blob 时,您可能需要添加 $scope.$apply() 以触发监视并进行相应的绑定。

InitRecording = function() 
    var reader = new FileReader();
    reader.onload = function() 
        audiosRC = $sce.trustAsResourceUrl(reader.result);
        $scope.$apply();
    ;
    reader.readAsDataURL(recordedBlob);

【讨论】:

你不需要 FileReader...如果你仔细看你会发现用户使用URL.createObjectURL(blob)创建了一个blob url 没错,如果您使用的是 FileReader,但仍然面临与 '$sce' 相同的错误,则需要调用 $apply 来触发监视变量更改

以上是关于Angular $sce 阻止了我的音频 blob src的主要内容,如果未能解决你的问题,请参考以下文章

Angular 5,httpclient,跨域请求被阻止

angular在IE7下兼容$sce:iequirks

如何使用 $sce 插入带有 angular.js 的 iframe?

您如何使用 $sce.trustAsHtml(string) 在 Angular 1.2+ 中复制 ng-bind-html-unsafe

将 Blob 数据作为 MultipartFile 从 Angular6 客户端发送到 Spring Boot API

angular中的ng-bind-html指令和$sce服务