如何在浏览器里面访问文件夹?

411 阅读2分钟

一、开场白

嘿,小伙伴们!你知道吗?在浏览器里不仅能看网页,还能“偷偷”打开你的文件夹,读取里面的文件内容!今天,我们要解锁一个神奇技能:如何用前端代码玩转文件夹里的小秘密~

二、装备清单

想要成功解锁这个技能,你需要这些小工具:

  • 🛠️ HTML5<input> 标签
  • 🧠 JavaScriptFileFileReader
  • 🏋️‍♂️ File System Access API(现代浏览器黑科技)
  • 🎧 事件监听器(Event Listeners)

准备好了吗?咱们开始吧!


三、用 webkitdirectory 翻箱倒柜

3.1 📂 选择文件夹

打开你的 HTML 工具箱,写下这行神秘代码:

<input type="file" id="folderInput" webkitdirectory multiple>
<div id="output"></div>
  • type="file" :文件选择器启动!
  • webkitdirectory:能选整个文件夹!
  • multiple:一次性带走多个文件!

3.2 🕵️‍♂️ 读取文件内容(包括子目录)

document.getElementById('folderInput').addEventListener('change', () => {
    const folderInput = document.getElementById('folderInput');
    const output = document.getElementById('output');
    output.innerHTML = '';
    
    if (folderInput.files.length > 0) {
        Array.from(folderInput.files).forEach(file => {
            const reader = new FileReader();
            reader.onload = (e) => {
                output.innerHTML += `<p><strong>${file.webkitRelativePath}:</strong> ${e.target.result}</p>`;
            };
            reader.readAsText(file);
        });
    } else {
        output.innerHTML = '<p>🫣 你还没选文件夹呢!</p>';
    }
});

3.3 📝 小提示

  • file.webkitRelativePath:能显示文件夹里的路径!
  • FileReader.readAsText:轻松读取文件内容!
  • onload:文件读取成功后触发!

四、用 File System Access API 深入探索

4.1 🗂️ 打开文件夹

想要更高阶的操作?咱们用上 File System Access API

<button onclick="readFolder()">🪄 选择文件夹并读取内容</button>
<div id="outputFS"></div>

4.2 🔍 遍历文件夹和子目录

async function readFolder() {
    const output = document.getElementById('outputFS');
    output.innerHTML = '';
    try {
        const directoryHandle = await window.showDirectoryPicker();
        await readDirectory(directoryHandle, '');
    } catch (err) {
        console.error('⚠️ 访问文件夹失败:', err);
    }
}

async function readDirectory(directoryHandle, path) {
    for await (const entry of directoryHandle.values()) {
        const fullPath = path ? `${path}/${entry.name}` : entry.name;
        if (entry.kind === 'file') {
            const file = await entry.getFile();
            const content = await file.text();
            outputFS.innerHTML += `<p><strong>${fullPath}:</strong> ${content}</p>`;
        } else if (entry.kind === 'directory') {
            await readDirectory(entry, fullPath);
        }
    }
}

4.3 📝 小提示

  • showDirectoryPicker:弹出文件夹选择窗口!
  • getFile:获取每个文件的内容!
  • readDirectory:递归读取子目录里的文件!

五、友情提醒

  1. 🔗 兼容性

    • webkitdirectory:仅在 Chrome 和 Edge 中表现良好。
    • File System Access API:现代浏览器(Chrome 86+、Edge 86+)支持。
  2. 🛡️ 安全性:浏览器不会让你“肆无忌惮”地访问用户文件。

  3. 🐢 性能:文件太多的话,可能会卡到爆!


六、实战场景

  • 📸 批量上传图片:一键选中文件夹,上传所有图片。
  • 📊 日志分析工具:批量读取日志文件。
  • 📁 文档管理器:高效管理多个文档。

七、尾声

🎉 恭喜你,成功掌握了文件夹读取的两种姿势:

  • webkitdirectory 的轻便快捷
  • File System Access API 的高阶递归

📚 小挑战:把文件内容展示得更美观,甚至加个进度条!