js让用户手动选择用户文件夹

起因是开发过程中客户有这么个需求:读取路径下文件夹数量生成对应html静态页面,并加载对应图片。
理解:静态页面需要根据提供的指定目录,识别到该路径下有多少个文件夹,有多少个文件夹就在静态页面中有多少行数据,然后还需要在表格中显示每个文件夹中的内容和图片信息。
但查阅了很多资料,如使用fs(需引用require.js)无法实现,后来找到了一个新的API可供用户主动选择用户文件夹。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <button>打开文件夹</button>
  <script>
    var btn = document.querySelector('button');
    btn.onclick=function() {
        showDirectoryPicker() //选择文件夹
    }
  </script>
</body>

</html>

showDirectoryPicker效果图
Window 接口的 showDirectoryPicker() 方法用于显示一个目录选择器,以允许用户选择一个目录。

参数:

  • id 通过指定 ID,浏览器能够记住不同 ID 所对应的目录。当使用相同的 ID 打开另一个目录选择器时,选择器会打开相同的目录。
  • mode 字符串,默认为 “read”,可对目录进行只读访问。设为 “readwrite” 可对目录进行读写访问。
  • startIn 一个 FileSystemHandle对象或者代表某个众所周知的目录的字符串(如:“desktop”、“documents”、“downloads”、“music”、“pictures”、“videos”)。用于指定选择器的起始目录。

返回值:

异常:AbortError

  • 当用户直接关闭了目录选择器或选择的目录是敏感目录时将会抛出 AbortError。

注意:用户必须与页面或 UI 元素进行交互才能使该特性正常运行

浏览器兼容性:
浏览器兼容性

try {
	var handle = showDirectoryPicker();
	console.log(handle);
} catch {
	alert("访问失败")
}

handle打印如下
打印handler

如下是完整代码:

var folderCount = 0;
        var btn = document.querySelector('button');
        btn.onclick = async function () {
            try {
                // 获得文件夹的句柄
                const handle = await showDirectoryPicker();
                const root = await processHandler(handle);
                //   获得文件内容
                const file = await root.children[1].getFile();
                const reader = new FileReader();
                reader.onload = e => {
                    // 读取结果
                    folderCount = e.target.result;
                    //获取到目标文件
                    console.log(e.target.result)
                    createTable(e.target.result)
                }
                reader.readAsText(file, 'utf-8')
            }
            catch {
                //用户拒绝查看文件
                alert('访问失败')
            }
        }
        //处理句柄
        async function processHandler(handle) {
            if (handle.kind === 'file') {
                return handle
            }
            handle.children = []
            const iter = await handle.entries();//获得文件夹中的所有内容
            //iter:异步迭代器
            for await (const info of iter) {
                var subHandle = await processHandler(info[1]);
                handle.children.push(subHandle)
            }
            return handle
        }
        function createTable(folderCount) {
            // 获取table的容器
            var ForlderTable = document.getElementById('ForlderTable');
            // var imagePath = './pages/igsData/';
            // 生成table的HTML代码
            var tableHTML = '<table>';
            tableHTML += '<tr><th>数据</th><th>图片1</th><th>图片2</th><th>图片3</th></tr>';
            for (var i = 0; i < folderCount; i++) {
                tableHTML += '<tr height=200px>';
                tableHTML += '<td><span>日期:</span><br><span>时间</span><br><span>距离:</span><br><span>传感器海拔:</span><br><span>描述:</span><br><span>目标:</span><br></td>';
                tableHTML += '<td><img src=./pages/igsData/' + i + '/' + i + '.png></td>';
                tableHTML += '<td><img src=./pages/igsData/' + i + '/' + i + '.png></td>';
                tableHTML += '<td><img src=./pages/igsData/' + i + '/' + i + '.png></td>';
                tableHTML += '</tr>';
            }
            tableHTML += '</table>';
            // 将生成的HTML插入到容器中
            ForlderTable.innerHTML = tableHTML;
        }

参考链接:
1.Window:showDirectoryPicker() 方法
2.使用Javascrip完成让用户选择本地文件夹

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周遭.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值