📜  在 ElectronJS 中拖放文件

📅  最后修改于: 2022-05-13 01:56:37.523000             🧑  作者: Mango

在 ElectronJS 中拖放文件

ElectronJS是一个开源框架,用于使用能够在 Windows、macOS 和 Linux 操作系统上运行的 HTML、CSS 和 JavaScript 等 Web 技术构建跨平台原生桌面应用程序。它将 Chromium 引擎和NodeJS组合成一个单一的运行时。
传统 Web 应用程序中的拖放操作与 Electron 之间存在一些差异。主要区别之一是 Electron 应用程序在 OS 环境中使用本机文件系统。因此,我们需要从用户机器上的本地文件对话框中获取任何拖到 Electron 应用程序上的文件的绝对文件路径。一旦我们获得了文件路径,我们就可以使用 NodeJS fs模块执行文件操作或将文件上传到服务器。 Electron 使用 HTML5 File API 来处理本地文件系统中的文件。本教程将演示如何在 Electron 应用程序中为本地文件实现拖放功能。
我们假设您熟悉上述链接中涵盖的先决条件。为了使 Electron 正常工作,需要在系统中预先安装nodenpm

  • 项目结构:

项目结构

示例:我们将首先按照给定的步骤构建基本的电子应用程序。

  • 第 1 步:导航到空目录以设置项目,然后运行以下命令,
npm init
  • 生成package.json文件。如果没有安装Electron ,请使用 npm 安装。
npm install electron --save
  • 此命令还将创建package-lock.json文件并安装所需的node_modules依赖项。成功安装 Electron 后,打开package.json文件并在scripts键下执行必要的更改。根据项目结构创建assets文件夹。将您选择的任何图像文件复制到资产文件夹并将其命名为image.png 。在本教程中,我们将使用 Electron 徽标作为image.png文件。该图像文件将被拖放到 Electron 应用程序的BrowserWindow中。
    包.json:
{
  "name": "electron-drag",
  "version": "1.0.0",
  "description": "File Drag and Drop in Electron",
  "main": "main.js",
  "scripts": {
    "start": "electron ."
  },
  "keywords": [
    "electron"
  ],
  "author": "Radhesh Khanna",
  "license": "ISC",
  "dependencies": {
    "electron": "^8.3.0"
  }
}
  • 第二步:根据项目结构创建一个main.js文件。该文件是主进程并充当应用程序的入口点。复制以下链接中给出的main.js文件的样板代码。我们已经修改了代码以满足我们的项目需求。
    主.js:
javascript
const { app, BrowserWindow } = require('electron')
 
function createWindow () {
  // Create the browser window.
  const win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      nodeIntegration: true
    }
  })
 
  // Load the index.html of the app.
  win.loadFile('src/index.html')
 
  // Open the DevTools.
  win.webContents.openDevTools()
}
 
// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
// This method is equivalent to 'app.on('ready', function())'
app.whenReady().then(createWindow)
 
// Quit when all windows are closed.
app.on('window-all-closed', () => {
  // On macOS it is common for applications and their menu bar
  // to stay active until the user quits explicitly with Cmd + Q
  if (process.platform !== 'darwin') {
    app.quit()
  }
})
 
app.on('activate', () => {
    // On macOS it's common to re-create a window in the
    // app when the dock icon is clicked and there are no
    // other windows open.
  if (BrowserWindow.getAllWindows().length === 0) {
    createWindow()
  }
})
 
// In this file, you can include the rest of your
// app's specific main process code. You can also
// put them in separate files and require them here.


html


  
    
    Hello World!
    
    
  
  
    

Hello World!

    We are using node     , Chrome     , and Electron     .       

    

Drag and Drop Files in the Window.

              


javascript
document.addEventListener('drop', (event) => {
    event.preventDefault();
    event.stopPropagation();
 
    for (const f of event.dataTransfer.files) {
        // Using the path attribute to get absolute file path
        console.log('File Path of dragged files: ', f.path)
      }
});
 
document.addEventListener('dragover', (e) => {
    e.preventDefault();
    e.stopPropagation();
  });
 
document.addEventListener('dragenter', (event) => {
    console.log('File is in the Drop Space');
});
 
document.addEventListener('dragleave', (event) => {
    console.log('File has left the Drop Space');
});


  • 第三步:根据项目结构在src目录下创建index.html文件和index.js文件。我们还将从上述链接复制index.html文件的样板代码。我们已经修改了代码以满足我们的项目需求。
    索引.html:

html



  
    
    Hello World!
    
    
  
  
    

Hello World!

    We are using node     , Chrome     , and Electron     .       

    

Drag and Drop Files in the Window.

              
  • 输出:此时,我们的基本电子应用程序已设置完毕。要启动 Electron 应用程序,请运行以下命令:
npm start

图形用户界面输出

使用 HTML5 File API,用户可以直接在系统 OS 环境中使用原生文件。这是可能的,因为 DOM 的文件接口为底层本地文件系统提供了抽象。 Electron 通过向其添加路径属性来增强 DOM 的文件接口。此路径属性公开文件系统上文件的绝对文件路径。我们将利用这个功能来获取拖放文件到 Electron 应用程序的绝对文件路径。有关更多详细信息,请参阅此链接。
拖放操作的所有Instance事件都属于DragEvent接口。此事件是一个DOM 事件,表示从开始到结束的拖放操作。此接口还从MouseEvent和全局事件接口继承属性。它具有用于数据传输的特定实例属性、 GlobalEventHandlers和我们在代码中使用的实例事件。有关更多详细信息,请参阅此链接。
index.js:在该文件中添加以下代码段。

javascript

document.addEventListener('drop', (event) => {
    event.preventDefault();
    event.stopPropagation();
 
    for (const f of event.dataTransfer.files) {
        // Using the path attribute to get absolute file path
        console.log('File Path of dragged files: ', f.path)
      }
});
 
document.addEventListener('dragover', (e) => {
    e.preventDefault();
    e.stopPropagation();
  });
 
document.addEventListener('dragenter', (event) => {
    console.log('File is in the Drop Space');
});
 
document.addEventListener('dragleave', (event) => {
    console.log('File has left the Drop Space');
});

下面对代码中使用的 HTML5文件API 的所有实例事件和属性进行详细说明。 DragEvent接口的所有实例事件都将在全局文档对象上触发,不能直接在特定 DOM 元素上触发。

  • event.dataTransfer此实例属性用于表示拖放操作期间正在传输的数据。在我们的例子中,正在传输的数据是一个文件,因此我们使用了event.dataTransfer.files并使用 Electron 提供的path属性获取了绝对文件路径。我们也可以一次拖放多个文件。如果数据是文本选择,我们可以在启动拖动操作时简单地使用event.dataTransfer.setData(key, text)方法。此方法为正在传输的文本数据设置唯一。要检索 Drop Operation 上的文本选择,我们可以简单地使用event.dataTransfer.getData(key)方法。此方法将返回使用提供的唯一设置的任何数据。
  • dragover: 事件当一个元素或文本选择被拖动到一个有效的放置目标(每几百毫秒)上时,这个事件被触发,例如另一个 DOM 元素。此事件的触发模式取决于鼠标指针的移动。默认情况下,当鼠标指针没有移动到有效的放置目标上时,此事件每 50 毫秒触发一次,否则大约在 5 毫秒到 1 毫秒之间快得多,但此行为会有所不同。此事件的事件处理程序属性是ondragover 。默认情况下,不能将元素或文本选择拖放到其他 DOM 元素中。为了允许放置,我们必须防止元素的默认处理。因此,我们为此目的使用了event.preventDefault()方法。元素的默认处理在放置时在浏览器中作为链接打开。
  • drop: Event当一个元素或文本选择被拖放到一个有效的拖放目标(例如另一个 DOM 元素)上时会触发此事件。此事件的事件处理程序属性是ondrop 。我们需要防止在此事件中对元素进行默认处理,就像对dragover事件所做的那样。
  • dragenter: Event当拖动元素或文本选择进入有效的放置目标(例如另一个 DOM 元素)时触发此事件。此事件的事件处理程序属性是ondrageneter
  • dragleave: Event当拖动的元素或文本选择离开有效的放置目标(例如另一个 DOM 元素)时触发此事件。此事件的事件处理程序属性是ondragleave

在此特定代码示例中不会触发dragStartdragdragenddragexit Instance 事件,因此已将其排除在外。所有这些实例事件都在拖动目标上触发,在这种情况下,应用程序中不存在拖动目标。文件的拖动操作是从应用程序外部从本机文件系统对话框内启动的。上述代码中使用的所有 Instance 事件都是在位于应用程序内的 Drop Target 上触发的。
注意: event.stopPropagation()方法可防止调用同一事件的传播。传播意味着向上传输到父 DOM 元素或向下传输到子 DOM 元素。
输出: