javascript - 缓存控制和 Canvas 的访问控制问题

标签 javascript amazon-web-services http-headers amazon-cloudfront cache-control

我正在尝试使用浏览器 Canvas 来处理我在云端托管的图像。我正在尝试设置 cloudfront 以使浏览器缓存具有缓存控制 max-age 的图像,并且仍然允许 Canvas 编辑这些图像。

这是我可以编辑的图片:

https://d2t4fc8ff77neh.cloudfront.net/cardSrcImage/1ac01l796_16dbmg07t_books2.jpg

这是我无法做到的(来自来源“https://d2t4fc8ff77neh.cloudfront.net”的图片已被跨源资源共享策略阻止加载:请求的资源上不存在“Access-Control-Allow-Origin” header 。因此不允许访问来源“https://localhost”。):

https://d2t4fc8ff77neh.cloudfront.net/cardSrcImage/1ac01o3l0_16dbmg07t_books2.jpg

唯一不同的是缓存控制 header 。怎么了?谢谢。

我正在使用 node.js knox 库上传。标题示例:

var headers = {
  'Content-Length': options.data.length,
  'Vary': 'Accept-Encoding',
  // 'Cache-Control': 'public, max-age=31536000',
  'x-amz-acl': 'public-read',
  'Content-Type': options.type
}

最佳答案

好吧,我假设你只想加载图像而不想将它们保存(POST)回到相同的URI .这有效!

Here是一个适用于两个图像的 jsbin。这是代码:

var img1 = new Image();
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');


//drawing of the test image - img1
img1.onload = function () {
  ctx.drawImage(img1, 0, 0);
};

//img1.src = 'https://d2t4fc8ff77neh.cloudfront.net/cardSrcImage/1ac01l796_16dbmg07t_books2.jpg';
img1.src = 'https://d2t4fc8ff77neh.cloudfront.net/cardSrcImage/1ac01o3l0_16dbmg07t_books2.jpg';

还有 canvas在 HTML 中:

<canvas id="canvas" width="1000" height="1000"></canvas>

所以你的问题可能是你如何加载图像,但你没有向我们展示你的代码。

缓存/跨域问题

您的问题是 <img>标记和 Javascript Image有一个非常不同的行为。您可以使用 <img> 包含来自整个 Internet 的图像。没有任何来源检查的标记,但用于 Javascript Image你的同源政策是活跃的。

在你原来的HTML你有<img>图像的标签。这会使您的浏览器在没有 Origin 的情况下获取图像 header 。这会导致您的服务器不发送 CORS header 。

稍后当您使用 Javascript 时 Image你的浏览器有一个缓存版本没有 CORS header ,并且会用它来响应。所以请求会失败!

有时 chrome 看起来足够智能,可以发出额外的请求,但这绝对不理想。

现在应该很容易解决这个问题。也许首先使用 Image然后是 <img>标签,或者不使用 <img>根本没有标签。您也可以始终发送 * 的 CORS header , 即使没有 Origin header 存在。


您的 resizing 中也有一个奇怪的问题功能,但我认为这是一个新问题的内容,如果你不能自己解决它的话。

关于javascript - 缓存控制和 Canvas 的访问控制问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35529050/

相关文章:

mysql - Amazon DynamoDB - 基于友谊设计表格

python-2.7 - 如何使用 boto3 get_object (Python 2.7) 从 S3 获取多个对象

javascript - 在 React 中,node.js .getHeaders() 相当于什么? (与axios react 的文件上传)

java - 不支持中文的 Content-Disposition 文件名

javascript - 你如何检测 JavaScript 中的内存限制?

javascript - 为什么我的警报没有显示我希望它显示的 DIV?

JavaScript 回调返回值

javascript - Promise 未定义而不是 bool 值

amazon-web-services - 为什么我不能在 Elastic Beanstalk 上编写带有 .ebextensions 的文件?

curl - 使用 curl 保留 HTTP header 的大小写