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

JS/TS中如何通过单个输入框同时上传文件与文件夹?

单个输入框同时上传文件和文件夹的解决方案

浏览器原生的input[type="file"]有个硬性限制:一旦添加directory/webkitdirectory属性,就只能选择文件夹,无法再选单个文件;反过来,不带这些属性的输入框只能选文件,不能选文件夹。所以没法用单个原生输入框同时实现两者,得用变通方法:

方案:双隐藏输入框+统一触发按钮

核心思路是准备两个输入框,分别处理文件和文件夹选择,然后用一个自定义按钮触发选择逻辑,让用户看起来像是在同一个入口操作。

React代码示例

import { useState, useRef } from 'react';

function FileFolderUploader() {
  const [selectedFiles, setSelectedFiles] = useState([]);
  const fileInputRef = useRef(null);
  const folderInputRef = useRef(null);

  // 处理单个/多个文件选择
  const handleFileSelect = (e) => {
    const newFiles = Array.from(e.target.files);
    setSelectedFiles(prev => [...prev, ...newFiles]);
  };

  // 处理文件夹选择(自动包含文件夹内所有层级的文件)
  const handleFolderSelect = (e) => {
    const newFiles = Array.from(e.target.files);
    setSelectedFiles(prev => [...prev, ...newFiles]);
  };

  // 触发选择弹窗,让用户选择上传类型
  const triggerUpload = () => {
    const choice = window.confirm('选择上传文件还是文件夹?');
    if (choice) {
      fileInputRef.current?.click();
    } else {
      folderInputRef.current?.click();
    }
  };

  return (
    <div>
      {/* 隐藏的文件输入框 */}
      <input
        type="file"
        onChange={handleFileSelect}
        className="hidden"
        multiple
        ref={fileInputRef}
      />
      {/* 隐藏的文件夹输入框 */}
      <input
        type="file"
        onChange={handleFolderSelect}
        className="hidden"
        multiple
        directory=""
        webkitdirectory=""
        ref={folderInputRef}
      />
      {/* 统一交互按钮 */}
      <button onClick={triggerUpload}>选择文件/文件夹</button>
      
      {/* 展示已选文件列表 */}
      <div className="selected-files">
        <h3>已选文件:</h3>
        <ul>
          {selectedFiles.map((file, idx) => (
            <li key={idx}>{file.name}</li>
          ))}
        </ul>
      </div>
    </div>
  );
}

export default FileFolderUploader;

关键说明

  • 两个输入框通过className="hidden"隐藏,用户只需要和统一按钮交互
  • 点击按钮后,通过弹窗让用户选择上传类型,再触发对应输入框的选择事件
  • 无论选文件还是文件夹,最终所有文件(包括文件夹内的文件)都会被收集到selectedFiles状态中,后续可以统一处理上传逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 03:11:14