uni-app 使用template模板转鸿蒙时,canvas的draw方法出现跨域报错

发布于 1周前 作者 yuanlaile 来自 Uni-App

uni-app 使用template模板转鸿蒙时,canvas的draw方法出现跨域报错

开发环境 版本号 项目创建方式
PC开发环境 Windows 10 专业版 22H2 HBuilderX
手机系统 HarmonyOS NEXT Developer Beta1 -
HBuilderX 4.24 -
Vue vue3 -

操作步骤:

  • 使用uni.chooseImage选择图片后获取到res.tempFilePaths[0]文件路径
  • 使用canvas.draw(文件路径)

预期结果:

  • 没有报错

实际结果:

  • E ERR_FAILED 报错了

bug描述:

canvas的draw方法跨域 E ERR_FAILED Access to image at ‘file://media/Photo/2/IMG_1726640213_001/922572c9cc214bb6a2dc83470a1b819.jpg’ from origin ‘null’ has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, arkweb, data, chrome-extension, chrome, https, chrome-untrusted. Access to image at ‘file://media/Photo/2/IMG_1726640213_001/922572c9cc214bb6a2dc83470a1b819.jpg’ from origin ‘null’ has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, arkweb, data, chrome-extension, chrome, https, chrome-untrusted." source: resource://rawfile/apps/HBuilder/www/__uniappview.html (0)


更多关于uni-app 使用template模板转鸿蒙时,canvas的draw方法出现跨域报错的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

7 回复

你好,可以提供一下一个可以复现的代码?

更多关于uni-app 使用template模板转鸿蒙时,canvas的draw方法出现跨域报错的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


uni.chooseImage({ count: 1, success: (res=>{ let context = uni.createCanvasContext(‘mycanvas’); context.drawImage(res.tempFilePaths[0]); context.draw(); }) })

很简单的案例,就是使用uni.chooseImage获取图片途径,然后使用uni.createCanvasContext获取实例,调用方法,然后在鸿蒙开发工具的控制台打印了这句话Access to image at ‘file://media/Photo/1/IMG_1725948676_000/9150e4e5gy1g08ooo4duoj205i05i3yl.jpg’ from origin ‘null’ has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, arkweb, data, chrome-extension, chrome, https, chrome-untrusted.网上说是跨域了

但是我不可能先上传到服务器返回在线链接再来画图吧,因为我的需求是裁图

感谢反馈,这个已确认,您可以等待一下后续会修复

有没有大概的日期呢

在处理uni-app使用template模板转鸿蒙(HarmonyOS)平台时,如果遇到canvas的draw方法出现跨域报错的问题,这通常是由于canvas加载的图片资源不在允许的域名列表中,或者资源加载方式不符合鸿蒙系统的安全策略。以下是一个处理此类问题的示例代码,展示如何在鸿蒙环境下安全地加载和使用canvas图片资源。

解决方案:使用本地资源或确保资源可访问

1. 使用本地资源

如果你的图片资源可以打包进应用,那么直接引用本地资源是最简单的方法。以下是一个使用本地图片资源的canvas绘制示例:

// 假设你的图片资源已经放在项目的static目录下
const canvas = this.$refs.myCanvas;
const ctx = canvas.getContext('2d');

// 加载本地图片
canvas.drawImage('/static/images/myImage.png', 0, 0, canvas.width, canvas.height, () => {
    console.log('Image drawn');
});

2. 确保资源服务器允许跨域访问

如果你的图片资源需要从远程服务器加载,你需要确保该服务器允许跨域访问。这通常需要在服务器上设置CORS(跨源资源共享)头部。不过,由于鸿蒙应用通常运行在受限的环境中,直接访问外部网络资源可能会受限。

3. 使用鸿蒙提供的API加载资源(如果适用)

鸿蒙系统可能提供了特定的API来加载和处理资源,以确保安全性和性能。尽管uni-app的API可能会抽象掉这些细节,但在遇到跨域问题时,了解并利用鸿蒙的原生API可能是一个解决方案。

示例:使用鸿蒙API(假设)

以下是一个假设性的示例,展示如何在鸿蒙环境中使用可能的API来加载图片资源到canvas:

// 假设鸿蒙提供了loadImageFromPath API
import harmonyOS from '@ohos.multimedia.image';

harmonyOS.loadImageFromPath('/path/to/local/image.png', (err, image) => {
    if (err) {
        console.error('Failed to load image:', err);
        return;
    }
    
    const canvas = this.$refs.myCanvas;
    const ctx = canvas.getContext('2d');
    // 假设鸿蒙canvas API允许直接绘制image对象
    ctx.drawImage(image, 0, 0, canvas.width, canvas.height);
});

注意:上述harmonyOS.loadImageFromPath是一个虚构的API,实际使用时需要参考鸿蒙系统的官方文档,了解如何正确加载和绘制图片。

总之,处理canvas跨域报错的关键在于确保图片资源的安全访问和合规加载。在鸿蒙平台上,这可能需要遵循特定的平台规则和使用平台提供的API。

回到顶部