| 
									
										
										
										
											2018-02-19 18:20:21 -06:00
										 |  |  | # Native File Drag & Drop
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-16 05:14:16 +03:00
										 |  |  | ## Overview
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-19 18:20:21 -06:00
										 |  |  | Certain kinds of applications that manipulate files might want to support | 
					
						
							|  |  |  | the operating system's native file drag & drop feature. Dragging files into | 
					
						
							|  |  |  | web content is common and supported by many websites. Electron additionally | 
					
						
							|  |  |  | supports dragging files and content out from web content into the operating | 
					
						
							|  |  |  | system's world. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-16 05:14:16 +03:00
										 |  |  | To implement this feature in your app, you need to call the | 
					
						
							|  |  |  | [`webContents.startDrag(item)`](../api/web-contents.md#contentsstartdragitem) | 
					
						
							| 
									
										
										
										
											2018-02-19 18:20:21 -06:00
										 |  |  | API in response to the `ondragstart` event. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-16 05:14:16 +03:00
										 |  |  | ## Example
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-18 17:55:24 -07:00
										 |  |  | An example demonstrating how you can create a file on the fly to be dragged out of the window. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ### Preload.js
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-16 01:22:49 -08:00
										 |  |  | In `preload.js` use the [`contextBridge`][] to inject a method `window.electron.startDrag(...)` that will send an IPC message to the main process. | 
					
						
							| 
									
										
										
										
											2021-05-18 17:55:24 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | ```js | 
					
						
							|  |  |  | const { contextBridge, ipcRenderer } = require('electron') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | contextBridge.exposeInMainWorld('electron', { | 
					
						
							| 
									
										
										
										
											2025-01-24 22:28:30 +01:00
										 |  |  |   startDrag: (fileName) => ipcRenderer.send('ondragstart', fileName) | 
					
						
							| 
									
										
										
										
											2021-05-18 17:55:24 -07:00
										 |  |  | }) | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ### Index.html
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Add a draggable element to `index.html`, and reference your renderer script: | 
					
						
							| 
									
										
										
										
											2018-02-19 18:20:21 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | ```html | 
					
						
							| 
									
										
										
										
											2021-05-18 17:55:24 -07:00
										 |  |  | <div style="border:2px solid black;border-radius:3px;padding:5px;display:inline-block" draggable="true" id="drag">Drag me</div> | 
					
						
							| 
									
										
										
										
											2020-10-16 05:14:16 +03:00
										 |  |  | <script src="renderer.js"></script> | 
					
						
							| 
									
										
										
										
											2018-02-19 18:20:21 -06:00
										 |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-18 17:55:24 -07:00
										 |  |  | ### Renderer.js
 | 
					
						
							| 
									
										
										
										
											2020-10-16 05:14:16 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-16 01:22:49 -08:00
										 |  |  | In `renderer.js` set up the renderer process to handle drag events by calling the method you added via the [`contextBridge`][] above. | 
					
						
							| 
									
										
										
										
											2020-10-16 05:14:16 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-20 23:50:08 -08:00
										 |  |  | ```js @ts-expect-error=[3] | 
					
						
							| 
									
										
										
										
											2020-10-16 05:14:16 +03:00
										 |  |  | document.getElementById('drag').ondragstart = (event) => { | 
					
						
							|  |  |  |   event.preventDefault() | 
					
						
							| 
									
										
										
										
											2021-05-18 17:55:24 -07:00
										 |  |  |   window.electron.startDrag('drag-and-drop.md') | 
					
						
							| 
									
										
										
										
											2020-10-16 05:14:16 +03:00
										 |  |  | } | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-18 17:55:24 -07:00
										 |  |  | ### Main.js
 | 
					
						
							| 
									
										
										
										
											2020-10-16 05:14:16 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-18 17:55:24 -07:00
										 |  |  | In the Main process (`main.js` file), expand the received event with a path to the file that is | 
					
						
							| 
									
										
										
										
											2020-10-16 05:14:16 +03:00
										 |  |  | being dragged and an icon: | 
					
						
							| 
									
										
										
										
											2018-02-19 18:20:21 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-20 23:50:08 -08:00
										 |  |  | ```fiddle docs/fiddles/features/drag-and-drop | 
					
						
							|  |  |  | const { app, BrowserWindow, ipcMain } = require('electron/main') | 
					
						
							|  |  |  | const path = require('node:path') | 
					
						
							|  |  |  | const fs = require('node:fs') | 
					
						
							|  |  |  | const https = require('node:https') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function createWindow () { | 
					
						
							|  |  |  |   const win = new BrowserWindow({ | 
					
						
							|  |  |  |     width: 800, | 
					
						
							|  |  |  |     height: 600, | 
					
						
							|  |  |  |     webPreferences: { | 
					
						
							|  |  |  |       preload: path.join(__dirname, 'preload.js') | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   win.loadFile('index.html') | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const iconName = path.join(__dirname, 'iconForDragAndDrop.png') | 
					
						
							|  |  |  | const icon = fs.createWriteStream(iconName) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Create a new file to copy - you can also copy existing files. | 
					
						
							|  |  |  | fs.writeFileSync(path.join(__dirname, 'drag-and-drop-1.md'), '# First file to test drag and drop') | 
					
						
							|  |  |  | fs.writeFileSync(path.join(__dirname, 'drag-and-drop-2.md'), '# Second file to test drag and drop') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | https.get('https://img.icons8.com/ios/452/drag-and-drop.png', (response) => { | 
					
						
							|  |  |  |   response.pipe(icon) | 
					
						
							|  |  |  | }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | app.whenReady().then(createWindow) | 
					
						
							| 
									
										
										
										
											2018-02-19 18:20:21 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | ipcMain.on('ondragstart', (event, filePath) => { | 
					
						
							|  |  |  |   event.sender.startDrag({ | 
					
						
							| 
									
										
										
										
											2023-11-20 23:50:08 -08:00
										 |  |  |     file: path.join(__dirname, filePath), | 
					
						
							|  |  |  |     icon: iconName | 
					
						
							| 
									
										
										
										
											2018-02-19 18:20:21 -06:00
										 |  |  |   }) | 
					
						
							|  |  |  | }) | 
					
						
							| 
									
										
										
										
											2023-11-20 23:50:08 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | app.on('window-all-closed', () => { | 
					
						
							|  |  |  |   if (process.platform !== 'darwin') { | 
					
						
							|  |  |  |     app.quit() | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | app.on('activate', () => { | 
					
						
							|  |  |  |   if (BrowserWindow.getAllWindows().length === 0) { | 
					
						
							|  |  |  |     createWindow() | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | }) | 
					
						
							| 
									
										
										
										
											2018-02-19 18:20:21 -06:00
										 |  |  | ``` | 
					
						
							| 
									
										
										
										
											2020-10-16 05:14:16 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-19 22:18:43 +01:00
										 |  |  | After launching the Electron application, try dragging and dropping | 
					
						
							| 
									
										
										
										
											2021-01-20 20:28:10 +01:00
										 |  |  | the item from the BrowserWindow onto your desktop. In this guide, | 
					
						
							| 
									
										
										
										
											2020-10-16 05:14:16 +03:00
										 |  |  | the item is a Markdown file located in the root of the project: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  | 
					
						
							| 
									
										
										
										
											2021-05-18 17:55:24 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | [`contextBridge`]: ../api/context-bridge.md |