代码之家  ›  专栏  ›  技术社区  ›  Oles Savluk

如何检查所选文件是目录文件还是常规文件?

  •  7
  • Oles Savluk  · 技术社区  · 6 年前

    const file = document.getElementById('file');
    file.addEventListener('change', e => {
      console.log(e.target.files[0]);
    });
    <input id="file" type="file" />
    您可以将文件夹拖放到此输入中。但我如何知道用户是否删除了目录或常规文件?
    3 回复  |  直到 6 年前
        1
  •  4
  •   Iguatemi Garin    4 年前

    选择目录时,FileReader无法读取其内容,因此会产生错误。下面是一个如何实现 用于上传。

    这个例子完全支持所有现代浏览器。

    const input = document.querySelector('input')
    input.onchange = (e) => {
      const file = input.files[0]
      isThisAFile(file)
      .then(validFile => console.log('Woohoo! Got a File:', validFile))
      .catch(error => console.log('Bummer, looks like a dir:', file, error))
    
    }
    function isThisAFile(maybeFile) {
      return new Promise(function (resolve, reject) {
        if (maybeFile.type !== '') {
          return resolve(maybeFile)
        }
        const reader = new FileReader()
        reader.onloadend = () => {
          if (reader.error && reader.error.name === 'NotFoundError') {
            return reject(reader.error.name)
          }
          resolve(maybeFile)
        }
        reader.readAsBinaryString(maybeFile)
      })
    }
    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>Document</title>
    </head>
    <body>
      <input type="file" />
    </body>
    </html>
        2
  •  2
  •   leximus    6 年前

    <input id="file" type="file" webkitdirectory directory multiple />
    

    然后 改变

        3
  •  1
  •   Vinod    6 年前

    可以使用“webkitGetAsEntry”方法检测目录,但不广泛支持 here is the reference

    const file = document.getElementById('file');
    file.addEventListener('change', e => {
      console.log(e.target.files[0]);
    });
    
    file.addEventListener('drop',onDrop);
    
    function onDrop(e) {
      e.preventDefault();
      e.stopPropagation();
    
      var items = e.dataTransfer.items;
      var files = e.dataTransfer.files;
    	var result = [];
      
      for (var i = 0, item; item = items[i]; ++i) {
    
        var entry = item.webkitGetAsEntry();
        var obj = {
    			name: entry.name,
    			isDirectory: entry.isDirectory,
    			isFile: entry.isFile
    		}
        result.push(obj);
      }
      
      console.log(result);
      return result;
    }
    <input id="file" type="file" />