代码之家  ›  专栏  ›  技术社区  ›  gman

在被拖到电子版之前,是否可以检查被拖动文件的文件类型?

  •  3
  • gman  · 技术社区  · 7 年前

    我有一个电子应用程序,我希望用户能够拖动文件到。我只希望他们能够拖动某些类型的文件(例如只有.xlsx和.docx),所以我想发出一个警告 在他们放下文件之前

    一些代码

    const dragElem = document.body;
    
    dragElem.addEventListener('drag', () => {
      console.log('drag');
    });
    
    dragElem.addEventListener('dragstart', () => {
      console.log('dragstart');
    });
    
    dragElem.addEventListener('dragenter', (e) => {
      console.log('dragenter');
      console.log(e);
      showFiles(e);
    });
    
    dragElem.addEventListener('dragexit', () => {
      console.log('dragexit');
    });
    
    
    dragElem.addEventListener('dragover', (e) => {
      e.preventDefault();
      console.log('dragover');
      console.log(e);
      showFiles(e);
      return false;
    });
    
    dragElem.addEventListener('dragleave', () => {
      console.log('dragleave');
      return false;
    });
    
    dragElem.addEventListener('dragend', () => {
      console.log('dragend');
      return false;
    });
    
    dragElem.addEventListener('drop', (e) => {
      console.log('drop');
      e.preventDefault();
      showFiles(e);
    
      return false;
    });
    
    function showFiles(e) {
      for (let f of e.dataTransfer.types) {
        console.log('Types(s) you dragged here: ', f);
      }
      for (let f of e.dataTransfer.items) {
        console.log('Items(s) you dragged here: ', f.kind, f.type);
      }
      for (let f of e.dataTransfer.files) {
        console.log('File(s) you dragged here: ', f.path);
      }
    }
    drag something here

    当我拖动不同的类型时,我会得到一些信息 event.dataTransform.items

    foo.exe    application/x-msdowload
    foo.txt    text/plain
    foo.json   <empty string>
    foo.xlsx   <empty string>
    foo.docx   <empty string>
    foo.png    image/png
    

    类型没有提供足够的信息。在用户删除文件之前不会提供文件名,这已经太晚了。我想知道在他们删除文件之前,或者我想能够根据扩展名筛选允许他们删除的内容,并在他们拖动时得到一个事件,说明他们的选择不符合过滤器。

    换句话说。

    dragElem.addEventListner('dragenter', (e) => {
      if (notExcelAndNotMSWordFile(e)) {
        showWarning();  // change CSS to show waring
      }
    });
    

    或者

    dragElem.setMagicFilter = /\.(xslx/.docx)$/;
    dragElem.addEventListener('dragbadmagic', () => {
      showWarning();
    });
    

    更新

    显然这在电子1.7之前一直有效

    https://github.com/electron/electron/issues/9840

    0 回复  |  直到 7 年前