我需要将一个远程图像转换成bas64给定其URL,但我运行在CORS错误,不知道如何工作。
在这个问题上,我遵循了一些解决方案:如何使用javascript将图像转换为base64字符串
我的示例图是:https://blog.xenproject.org/wp-content/uploads/2014/10/Testing.jpg
方法1(FileReader):
function toDataUrl(url, callback) {
var xhr = new XMLHttpRequest();
xhr.onload = function() {
var reader = new FileReader();
reader.onloadend = function() {
callback(reader.result);
}
reader.readAsDataURL(xhr.response);
};
xhr.open('GET', url);
xhr.responseType = 'blob';
xhr.send();
}
toDataUrl('https://blog.xenproject.org/wp-content/uploads/2014/10/Testing.jpg', function(data) { console.log(data)} );
这将产生以下错误:
XMLHttpRequest无法加载https://blog.xenproject.org/wp-content/uploads/2014/10/Testing.jpg.请求的资源上不存在访问控制允许起源标头。因此,http://stackoverflow.com的来源不允许访问。
方法2(画布)
function toDataUrl(src, callback, outputFormat) {
var img = new Image();
img.crossOrigin = 'use-credentials';
img.onload = function() {
var canvas = document.createElement('CANVAS');
var ctx = canvas.getContext('2d');
var dataURL;
canvas.height = this.height;
canvas.width = this.width;
ctx.drawImage(this, 0, 0);
dataURL = canvas.toDataURL(outputFormat);
callback(dataURL);
};
img.src = src;
if (img.complete || img.complete === undefined) {
img.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==";
img.src = src;
}
}
toDataUrl('https://blog.xenproject.org/wp-content/uploads/2014/10/Testing.jpg', function(data) { console.log(data)} );
在'https://blog.xenproject.org/wp-content/uploads/2014/10/Testing.jpg“起源”http://stackoverflow.com'已被CORS策略阻止:请求的资源上不存在'Access Control Allow Origin'标头。起源'http://stackoverflow.com因此,不允许访问。
还尝试了:
img.crossOrigin = 'anonymous';
得到了同样的结果。
方法3(使用img元素的画布):
img = document.createElement('img');
img.onload = function() {
var canvas = document.createElement('CANVAS');
var ctx = canvas.getContext('2d');
var dataURL;
canvas.height = this.height;
canvas.width = this.width;
ctx.drawImage(this, 0, 0);
dataURL = canvas.toDataURL('image/jpg');
console.log(dataURL);
};
img.src = 'https://blog.xenproject.org/wp-content/uploads/2014/10/Testing.jpg';
这样至少可以加载映像,但调用toDataURL时失败,原因是:
顺便说一句,我不确定CORS的政策到底在保护什么。假设存在某种可能触发攻击的恶意负载。我们仍然在DOM中加载和显示图像,为什么要信任由同一endpoint设置的CORS头?
有人知道解决这个问题的办法吗?
谢谢你的帮助。
通过CORS代理提出请求,您可以绕过CORS限制,如下所示:
var proxyUrl = 'https://cors-anywhere.herokuapp.com/',
targetUrl = 'https://blog.xenproject.org/wp-content/uploads/2014/10/Testing.jpg'
toDataUrl(proxyUrl + targetUrl,
function(data) { console.log(data)} );
代理将请求发送到targetUrl
,然后在收到该请求的响应后,添加Access Control Allow Origin
响应头
添加了Access-Control-允许-Origin
标头的响应是浏览器看到的,因此浏览器允许您的前端代码访问响应,并且您不会得到任何CORS错误。
https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS解释了发生了什么,导致需要配置请求发送到的服务器,以便它发送必要的CORS标头,或者在两者之间放置一个代理来为您添加CORS标头(如上所述)...
与此答案中的代码片段中使用第三方代理不同,您可以非常轻松地使用来自的代码设置自己的CORS代理https://github.com/Rob--W/cors-anywhere/ 或诸如此类。
顺便说一句,我不确定CORS的政策到底在保护什么。
在这种情况下,它根本没有真正保护任何东西,因为您可以使用任何服务器端编程语言或公共代理或curl
或其他任何东西来https://blog.xenproject.org/wp-content/uploads/2014/10/Testing.jpg。
维护者https://blog.xenproject.org 正确的做法是让他们的服务器自行配置,以发送一个访问控制允许源站
响应头,告诉浏览器允许从任何源站获取他们的内容。但既然他们没有,你只需要使用一个代理。
CORS限制真正有用的唯一情况是用于运行在intranet上或某种防火墙后面的资源。因为在内联网/防火墙的情况下,让任意web应用程序以与内联网/防火墙内的用户相同的权限运行不是一个好主意。
我的页面上显示了一幅由WaterMarkJs库生成的图像。 数据:图像/png;基础64,IVBORW0KGGOAAAANQKCBAWQIECBAYAABGT5AEQ2BAECBAGIDOAAECBAGMICDQBYIIIRAGQEAGQEAGQEAGQEAGQEAGQEAGQEAGQEAGQEAGQEAGQEAGG0M0BAGQIAGQEAGQEAGQEAGQEAGQEAGQEAGQEAGQEA
问题内容: 这个问题已经在这里有了答案 : ImageIO.read在字节数组上返回null (1个答案) 6年前关闭。 我无法将我的Blob转换为缓冲图像,因此可以使用它。我从使用inputstream上传的数据库中得到了一个blob(jpg图像)。在我的数据库中,它存储为BufferedInputStream,我注意到了。我得到的Blob很好,它有一堆怪异的符号,并说它是jpg,所以图像必须很
假设我有一个图像...有没有可能把它拆分成一个图像数组,每个按钮都有图像的一部分?我需要为每个按钮分配坐标,所以当图像的一个部分被按下时,我就会得到图像的那个部分的坐标
问题内容: 有什么方法可以将图像转换为javascript中的二进制数据,反之亦然。 问题答案: 我想用JavaScript获取图像数据?回答您的问题: 将标签传递给此功能。它将以base64编码返回图像。但是它将被重新编码。因此,您无法访问原始图像数据。
问题内容: 有没有一种方法可以将JPanel(尚未显示)转换为BufferedImage? 谢谢, 杰夫 问题答案: 在BufferedImage中,您可以创建一个图形对象,可用于在JPanel上调用画图,如下所示: 您可能需要确保首先设置面板的尺寸。
我有一个UIExtView和一个UIImageView,我想把它们转换成一个单独的图像来共享。 SaveImageView是ImageView,我想在这里保存textview的图像。 Textview可以在屏幕上移动它,所以我决定保存它们的最终位置,并将其交给SaveImageView。 首先转换图像中的UItext View并保存他的位置。 然后,我想加入两个Imageview,成一个单一的图像