21

我正在尝试将图像加载到画布元素中,然后在 toDataURL() 中提取数据。

我的网站使用 Ruby on Rails 2.3 运行

我从 aws s3 提供图像。我有设置cors:

<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
  <CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>HEAD</AllowedMethod>
    <MaxAgeSeconds>3000</MaxAgeSeconds>
    <AllowedHeader>*</AllowedHeader>
  </CORSRule>
</CORSConfiguration>

我有一个画布元素:

<canvas id="explain_canvas"></canvas>

好的,那么一些背景。我最初是用这样的代码尝试这个,其中drawing_image只是图像的url。

var outlineImage = new Image();
outlineImage.crossOrigin = '';
outlineImage.src = drawing_image;
outlineImage.onload = function() {
  var canvas = document.getElementById('explain_canvas');
  var context = canvas.getContext("2d");
  context.drawImage(outlineImage, 10, 10, 600, 150);
}

但这不是发送原始标头。所以我想我会尝试通过 jquery 进行 ajax 调用

var outlineImage = new Image();
$(outlineImage).attr('crossOrigin', '');
$.ajax({
    type: 'get',
    url : drawing_image,
    contentType: 'image/png',
    crossDomain: 'true',
    success: function() {
        $(outlineImage).attr("src", drawing_image);
    },
    error: function() {
        console.log('ah crap');
    }
});

outlineImage.onload = function() {
 var canvas = document.getElementById('explain_canvas');
 var context = canvas.getContext("2d");

 context.drawImage(outlineImage, 10, 10, 600, 150);
}

但仍然没有运气。我弄错了吗?该 jquery ajax 是否应该发送原始标头?

我查看了请求标头,这就是我在图像上得到的:

Accept:*/*
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Host:em2-images.s3.amazonaws.com
Referer:http://localhost:3000/courses/18/quizzes/22/take
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.101 Safari/537.11

并且 jquery 错误与此:

XMLHttpRequest cannot load http://em2-images.s3.amazonaws.com/EM2_LF_A_5_item6.png. Origin http://localhost:3000 is not allowed by Access-Control-Allow-Origin.
ah crap

对我来说奇怪的是 jquery 说明了来源,但它不在请求标头中。

这个 stackoverflow 问题在这里表明他想删除源头。好吧,他正在做与 jquery ajax 相同的调用并得到它。任何想法为什么我不是?

如果我重新加载页面,它会抓取缓存的图像并正常加载(请注意原始标头)并调用 toDataURL() 就好了。在我清除缓存后,在图像被缓存之前,它在第一次加载时将无法正常工作。

我开始怀疑 Rails 是否对它做了什么,但我不知道它会如何,因为这是一个 ajax 调用。但是谁知道呢,有人知道 Rails 是否可以做到这一点吗?

我已经在不同平台上的几个浏览器中尝试过这个。Chrome、Firefox、Safari、IE 9 和 10。在我的 Mac、PC 和 iPhone 上。他们中的任何一个都没有骰子。

-谢谢-

4

2 回答 2

32

经过一番脑筋急转弯,我弄清楚了为什么我的浏览器没有发送原始标头。

首先是一点背景。这是针对 LMS 的,是测验的一部分。当老师编写测验时,他们将问题文本和图像添加到绘图画布中,让学生用绘图解释他们的答案。

您可以猜到,该图像首先被加载。它从学生视图中隐藏,我从该图像中获取 src url,并尝试使用 javascript 将其放入 canvas 元素中。

那么问题是第一次加载图像时,它没有加载 crossorigin 属性。因此没有原始标题。并且当画布元素尝试加载图像时,它被缓存而没有原始标头。当它试图让 cors 运行时,它会呕吐。在我看来,这可能是所有浏览器都需要修复的错误。但也许不是。

因此,简而言之,在进行 cors 时,请确保图像的第一次加载带有 crossorigin 属性以包含原始标头。当我...

是的,是时候重构了……

于 2013-01-09T15:12:13.697 回答
3

我收到了这个 CORS 错误,并且在服务器端没有发送原始标头。

我的问题是我crossOrigin = Anonymous在我的图像标签中设置了。删除它为我解决了问题,并且 CORS 错误消失了。

于 2016-12-22T03:24:25.100 回答