【发布时间】:2022-03-03 19:54:51
【问题描述】:
假设我得到一个 .jpg 文件的目录列表,然后想要显示它们
const fs = require('fs');
fs.readDirSync(someAbsolutePathToFolder)
.filter(f => f.endsWith('.jpg'))
.forEach(filename => {
const img = new Image();
const filepath = path.join(someAbsolutePathToFolder, filename);
img.src = `file://${filepath.replace(/\\/g, '/')}`;
document.body.appendChild(img);
});
这将失败。举个例子,如果我得到的列表有这样的名字
#001-image.jpg
#002-image.jpg
上面的代码会产生类似的 URL
file://some/path/#001-image.jpg
你可以看到的是一个问题。网址将在#处截断。
This answer 声称我应该使用 encodeURI 但这也失败了,因为它使 # 未转义。
使用encodeURIComponent 也不起作用。它替换了/ 和: 和空格,Electron 找不到该文件,至少在 Windows 上找不到。
到目前为止,我有这样的事情
const filepath = path.join(someAbsolutePathToFolder, filename).replace(/\\/g, '/');
img.src = `file://${filepath.split('/').map(encodeURIComponent).join('/')}`;
但这在 Windows 上也失败了,因为驱动器号从 c:\dir\file 转换为 c%3a\dir\file,这似乎是电子的相对路径。
所以我有更多特殊情况试图检查路径开头的 [a-z]: 以及 UNC 路径的 \\。
今天我遇到了上面提到的# 问题,我预计会有更多的定时炸弹在等着我,所以我问...
以跨平台方式将文件名转换为 URL 的正确方法是什么?
或者更具体地说,如何解决上述问题。给定本地平台上图像文件绝对路径的目录列表,如果分配给图像的 src 属性,则生成将加载这些图像的 URL。
【问题讨论】:
-
url-join 完全无法解决上述单个问题。
-
encodeURI 只编码非拉丁符号
标签: javascript electron