代码编织梦想

用 canvas.toDataURL() 将图片转为Base64编码时避免跨域报错的方法【避坑】


梗概

本文主要介绍canvas.toDataURL()将图片转为Base64编码时避免跨域的两种方法:

1、搭建服务器,将HTML文件和图片挂在服务器上使两者位于同一域下(较麻烦);

2、用 URL.createObjectURL() 方法创建一个指向file域的blob(相当于临时URL),再将blob作为图片的URL就能对图片进行base64编码了(简单快捷)。

一、具体报错信息:

直接在本地执行用于Base64编码的HTML文件会出现以下错误:

Access to image at ‘file:///C:/Users/ZXF/Desktop/timg.jpg?timeStamp=Sun%20Dec%2013%202020%2009:40:29%20GMT+0800%20(%E4%B8%AD%E5%9B%BD%E6%A0%87%E5%87%86%E6%97%B6%E9%97%B4)’ from origin ‘null’ has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, chrome-untrusted, https.

或者如下图:
具体报错

二、报错原因:

这是浏览器为了保证数据的安全,对跨域(在这里指网址和图片地址不在同一个域下传输)的限制。网上有很多描述,在此不再赘述。

三、解决方法:

方法一:搭建服务器(较麻烦)

思路:将你的网站和图片挂在服务器上,从而使得网址和图片地址位于同一个域下(既然浏览器不允许跨域,那就不跨域)。

具体实现:

(1)以Nginx搭建服务器为例,首先将HTML文件及图片放在nginx的根目录下

在这里插入图片描述

(3)运行nginx搭建服务器

(4)浏览器打开 http://127.0.0.1/图片Base64编码.html 或 http://localhost/图片Base64编码.html ,当然你也可用你的域名或公网IP+/图片Base64编码.html 访问

图片编码成功
至此编码成功,成功避坑!

附HTML中的代码:

<!DOCTYPE html>
<html>
<head>
	<title>图片Base64编码</title>
	<meta charset='utf-8'>
</head>
<body>
	<script>
		var img = new Image()
		img.src = 'timg.jpg'
		img.onload = function() {	// onload事件确保图片加载完成后再执行转换任务
		    var canvas = document.createElement('canvas')
		    canvas.width = img.width
		    canvas.height = img.height
		    canvas.getContext("2d").drawImage(img, 0, 0)
		    let base64 = canvas.toDataURL()
		    console.log(base64)  // 在控制台输出 Data URI
		    let showImg = document.createElement('img')	// 图片展示
		    showImg.src = base64
		    document.getElementsByTagName('body')[0].appendChild(showImg)
		}
	</script>
</body>
</html>


方法二:使用 URL.createObjectURL() 方法

使用URL.createObjectURL(object) 免去搭建服务器

先上代码!

<!DOCTYPE html>
<html>
<head>
	<title>图片Base64编码</title>
	<meta charset='utf-8'>
</head>
<body>
	<input type='file' onchange="base64Encode()" id="inputImg">
	<img src="" id="showImg">
	<script>
		function base64Encode() {
			let img = new Image()
			let imgObj = document.getElementById('inputImg').files[0]	// 获取file域
			img.src = URL.createObjectURL(imgObj)	// 将file的blob作为图片的URL
			img.onload = function() {	// onload事件确保图片加载完成后再执行转换任务
			    let canvas = document.createElement('canvas')
			    canvas.width = img.width
			    canvas.height = img.height
			    canvas.getContext("2d").drawImage(img, 0, 0, img.width, img.height)
			    let base64 = canvas.toDataURL()
			    console.log(base64)  // 在控制台输出 Data URI
			    document.getElementById('showImg').src = base64 	// 图片展示
			}
		}
	</script>
</body>
</html>

步骤:

选择图片后,先获取一个file域,然后用URL.createObjectURL() 方法生成一个指向该域的blob(相当于临时URL),将其赋值给图片的src属性,接着绘图编码就行了。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/ZXF_BW/article/details/111101047

AdminLte3改造为:单iframe,多级动态json菜单-爱代码爱编程

一、下载代码 https://gitee.com/zhou-kang/admin-lte3-i-frame-json_menus 二、运行index.html 三、核心文件menu.js menu.js中定义了json格式的菜单,并将json转为adminLte的菜单html,可根据需要改在为动态菜单。 pages/test/leaf*.ht

Nginx 方向代理解决跨域问题-2-爱代码爱编程

概述 在浏览器端进行 Ajax 请求时会出现跨域问题,那么什么是跨域,如何解决跨域呢?先看浏览器端出现跨域问题的现象,如下图所示 什么是跨域问题? 跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对 JavaScript 施加的安全限制。 什么是同源? 所谓同源是指,域名,协议,端口均相同 http://www.

Intent的数据传递-爱代码爱编程

Intent的数据传递类型分为两类: 1.第一种的向下一个activity传递数据 (1)调用Intent的构造方法传activity名: Intent intent = new Intent(MainActivity.this, Thirdctivity.class); intent.putExtra("name", "zhansan");

bootstrap-爱代码爱编程

bootstrap简介 1)bootstrap由@mdo 和 @fat 在Twitter工作时创建,Bootstrap使用 LESS CSS 并用 Node 编译,托管在 GitHub 上,方便大家使用这一框架构建更好的web应用。 2)Bootstrap不光为了看起来好看,而且在现代的桌面浏览器上有极佳的表现(包括IE7!)。在平板电脑和智能手机上面

SEO让品牌展示在Google搜索结果右侧-爱代码爱编程

要增强您的官方网站在Google搜索结果中的显示效果和覆盖范围,您可以先针对Google设置该网站。这样一来,用户就能在搜索时更轻松地识别官方网站,并更轻松地找到您提供的信息。 Google提供了多种方法来帮助您提供关键的商家详情,以便在Google搜索结果中向用户显示这些信息。本文将介绍如何使您的营业地点、官方网站和内容信息显示在搜索结果、Google

HTML 初识笔记总结(一)-爱代码爱编程

HTML 初识笔记总结(一) hello world! 我是前小白,一名平凡的小白级前端工程师。 一、 HTML常见页面规范 <!DOCTYPE html>叫浏览器用 HTML5 文档格式解析该网页 <html lang="en"> 网页语言中文 <head> <me

JavaScript的ES6语法-爱代码爱编程

1. let声明变量 1)在js中,使用var声明的变量往往会越域,而使用let声明的变量,有严格的局部作用域。 2)var可以给一个变量声明多次,而let只能声明一次。 3)var 会变量提升,let 不存在变量提升 //var 声明的变量往往会越域 //let 声明的变量有严格局部作用域 { var a = 1; let b =

2020年下半年1+X Web前端开发(中级)实操考试模拟试题一(附答案)-爱代码爱编程

传送门教育部:职业教育将启动“1+X”证书制度改革职业教育改革1+X证书制度试点启动1+X成绩/证书查询入口 文章目录 试题一(每空 2 分,共 30 分)试题一答案试题二(30分)试题二答案试题三(每空 2 分,共 20 分)试题三答案试题四(每空 2 分,共 20 分)试题四答案 试题一(每空 2 分,共 30 分) 阅

LeetCode 300. 最长连续序列(map + 朴素遍历)+(set + 优化遍历)—— JavaScript-爱代码爱编程

相似题:LeetCode 300. 最长上升子序列 本题链接:https://leetcode-cn.com/problems/longest-consecutive-sequence/ 题描述: 解题思路(map + 遍历): 利用 map 表示当前元素是否存在数组中。 每次对当前元素进行向前和向后的遍历,统计该元素的连续序列的长度。 代

innerHTML和innerText的用法以及不同点-爱代码爱编程

innerHTML和innerText的区别 两者的主要区别在于用法不同; innerHTML可以将获取的元素作为HTML元素进行解析或修改, innerText可以将获取的元素作为纯文本进行解析或修改。 innerHTML和innerText的具体用法: <!DOCTYPE html> <html> <head>

js用于 table 表格的 增删改方法-爱代码爱编程

.rows 返回的是一个数组 可以获取到这个标签中所有的行数及元素 也可以使用角标来获取固定的某个元素 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head>

vue中常用的指令-爱代码爱编程

一.vue中的指令 1.v-model 用于表单中数据框和数据的相互绑定 v-model会忽略所有表单元素的value、checked、selected特性的初始值。因为它选择Vue实例数据做为具体的值。 <div id="app"> <input v-model="somebody"> <p>he