在Chrome应用中的<img/>标记中加载外部图片

时间:2014-06-13 06:37:08

标签: javascript html5 google-chrome google-chrome-app content-security-policy

我想知道如何在图像标记中加载外部图像,例如:

<div id="page4">
  <img src="https://encrypted-tbn3.gstatic.com/images?q=tbn:ANd9GcRX1-0FwHVmDbsTFz8454Sx3fZFeQ-kO-xZ-Q6aYzMw3dCh6ybHT8TApuBPnA"/>
</div>

我必须添加到manifest.json

它发出以下错误:

Refused to load the image 'https://encrypted-tbn3.gstatic.com/images?q=tbn:ANd9GcRX1-0FwHVmDbsTFz8454Sx3fZFeQ-kO-xZ-Q6aYzMw3dCh6ybHT8TApuBPnA' because it violates the following Content Security Policy directive: "img-src 'self' data: chrome-extension-resource:".

2 个答案:

答案 0 :(得分:6)

这是一个常见问题,Chrome团队为您开发了一个图书馆来帮助解决这个问题:Chrome Packaged Apps Resource Loader

根据文档:

  

您可以使用XMLHttpRequest和transform请求外部图像   他们进入ObjectURLs。然后将标记中的src属性设置为   每个ObjectURL都应该有效。

     

由于这是一个非常常见的用例,我们创建了这个库   简化它。只需将apps-resource-loader ral.min.js删除到您的   项目然后:

var remoteImage, 
    container = document.querySelector('.imageContainer'),
    toLoad = { 'images': [ 
       'http://myserver.com/image1.png', 
       'http://myserver.com/image2.png' ] }; // list of image URLs

toLoad.images.forEach(function(imageToLoad) {
      remoteImage = new RAL.RemoteImage(imageToLoad);
      container.appendChild(remoteImage.element);
      RAL.Queue.add(remoteImage);
});
RAL.Queue.setMaxConnections(4);
RAL.Queue.start();
  

请记住,您需要manifest.json中的所有域的权限   你将成为XHR。如果你事先不知道那些   图像将被托管,您可以请求任何网址的许可:

permissions: ['<all_urls>'],
  

有关其他用途,请参阅以下简单演示:   https://github.com/GoogleChrome/apps-resource-loader/tree/master/demo

答案 1 :(得分:5)

应用中的内容安全政策无法放宽。

如果您想混合应用中的外部资源(<webview>之外),则需要fetch them yourself

  

您可以通过XMLHttpRequest获取远程资源,并通过blob:,data:或filesystem:URL提供服务(请参阅Referencing external resources)。