Qt6.8.2中WebAssembly沙盒环境中预加载文件
在WebAssembly的沙盒环境中是不允许直接按照绝对路径访问文件的。
WebAssembly作为Web技术的一部分,应该也遵循同源策略,直接访问绝对路径可能会破坏同源策略,导致不同来源的代码能够随意访问彼此的文件资源,引发安全漏洞。
正确的使用方式:
1:在pro中将本地需要加载的文件预加载到虚拟路径中。
假设本地文件的路径结构如下所示
--preload-file <本地路径>@<虚拟路径>
代码设置:
#虚拟沙盒环境
QMAKE_LFLAGS += --preload-file $$PWD/resource/data@/working
<本地路径>
($$PWD/resource/data
)
表示 项目本地目录($$PWD
是 qmake 变量,代表当前项目路径)下的 resource/data
文件夹。
例如:/home/project/resource/data
<虚拟路径>
(/working
)
指定文件在 WebAssembly 虚拟文件系统 中的挂载位置。
例如:/working/data/file.txt
使用这种方式就可以将本地文件夹映射到虚拟文件系统,在程序中直接访问虚拟文件夹中的内容就行了。
2:访问虚拟文件,遍历虚拟文件夹内容
//展示虚拟文件夹列表信息
QDir dir("/working");
QStringList listVirtual = dir.entryList(QDir::NoDotAndDotDot | QDir::AllEntries);
listVirtual.sort(); // 按字母顺序排序
// 遍历并分类显示
for (const QString &entry : listVirtual)
{QFileInfo info(dir.absoluteFilePath(entry));if (info.isDir()) {qDebug() << "[DIR] " << entry;} else if (info.isFile()){qDebug() << "[FILE]" << entry << info.size() << "bytes";ui->listVirtual->addItem(entry);} else if (info.isSymLink()) {qDebug() << "[LINK]" << entry << "->" << info.symLinkTarget();}
}
使用这种方式就可以访问本地文件了。
我是糯诺诺米团,一名C++开发程序媛~