You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tauri应用中JS加载本地图片报错:不允许加载本地资源

解决Tauri中JS无法用绝对路径加载本地图片的问题

问题原因

Tauri的安全机制会阻止WebView直接加载本地绝对路径的资源,你设置的tauri.allowlist.fs.scope仅控制Tauri文件系统API(如readFile)的访问权限,不作用于DOM的资源加载逻辑,所以直接给Image.src赋值绝对路径会触发权限错误。

解决方案

方法1:使用convertFileSrc转换路径(推荐)

Tauri提供了convertFileSrc工具,能将本地绝对路径转换为WebView允许加载的安全URL格式(如tauri://localhost/xxx)。

示例代码:

async function loadLocalImage() {
    // 获取exe所在目录
    const exeDir = await window.__TAURI__.path.executableDir();
    // 拼接图片的绝对路径(替换成你的图片文件名)
    const absolutePath = await window.__TAURI__.path.join(exeDir, "generated-image.png");
    // 转换为安全URL
    const safeImageUrl = window.__TAURI__.convertFileSrc(absolutePath);
    
    // 加载图片
    const image = new Image();
    image.onload = () => redraw();
    image.src = safeImageUrl;
}

// 调用加载函数
loadLocalImage();

方法2:通过Rust将图片转为Base64返回给JS

既然图片是Rust生成的,可以直接在Rust命令中读取图片并转为Base64字符串,JS再用data URI加载。

Rust命令代码:

use base64::{engine::general_purpose, Engine as _};
use std::fs;
use std::path::Path;

#[tauri::command]
pub fn get_generated_image_base64() -> Result<String, String> {
    // 获取exe所在目录
    let exe_path = std::env::current_exe().map_err(|e| e.to_string())?;
    let img_path = exe_path.parent()
        .ok_or("无法获取可执行文件所在目录")?
        .join("generated-image.png");
    
    // 读取图片并转Base64
    let img_bytes = fs::read(img_path).map_err(|e| e.to_string())?;
    Ok(general_purpose::STANDARD.encode(img_bytes))
}

JS调用代码:

async function loadImageFromBase64() {
    const base64Str = await window.__TAURI__.invoke("get_generated_image_base64");
    const image = new Image();
    image.onload = () => redraw();
    image.src = `data:image/png;base64,${base64Str}`;
}

loadImageFromBase64();

关键说明

  • convertFileSrc是Tauri专门用于解决本地资源加载权限的工具,适配所有支持的平台,无需手动处理路径分隔符或权限问题。
  • 若使用Base64方案,注意大图片会增加内存占用,适合小尺寸图片场景。

内容的提问来源于stack exchange,提问作者Azukitsu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 15:40:28