390 字
2 分钟
解决 Tauri 文件拖放无效问题

点进这篇文章的应该都是在 Tauri 拖拽时踩了坑的,按照惯用的方案,文件拖放一般会通过 onDragonDrop 实现,比如:

const handleDrag = (e: React.DragEvent<HTMLDivElement>) => {
	e.preventDefault();
	e.stopPropagation();
	if (e.type === 'dragenter' || e.type === 'dragover') {
		setDragActive(true);
	} else if (e.type === 'dragleave') {
		setDragActive(false);
	}
};

const handleDrop = (e: React.DragEvent<HTMLDivElement>) => {
	e.preventDefault();
	e.stopPropagation();
	setDragActive(false);
	if (e.dataTransfer.files && e.dataTransfer.files.length > 0) {
		const filesArray = Array.from(e.dataTransfer.files);
		handleFileUpload(filesArray);
	}
};

这种写法没有问题,但在 Tauri 中,默认是无效的,也就是你把文件拖上去根本触发不了 dragdrop 事件

这个实际上是 Tauri 的问题,不是前端代码问题,Tauri 托管了 Webview 的相关事件,所以事件会先走到他那层,再由他决定是否转发给前端,对应的解决方法就有两种。

通过 Tauri 事件#

listen('tauri://file-drop', event => {
  console.log(event)
})
// 对应的还有 tauri://file-drop-cancelled 和 tauri://file-drop-hover

直接在 Tauri 层捕获拖放事件,通过回调通知前端去处理。

要注意这里拿到的只有文件路径,所以你还得通过 Tauri 的 fs 去读取文件内容(有坑,请参考往期文章)。

通过配置#

修改 tauri.conf.json 文件,在 tauri.windows 中,给项目加上 fileDropEnabled,并设置为 false,这样前端代码不需要动,就能在 Windows 下生效。

这种改法最简单,但兼容性比较差,fileDropEnabled 控制“是否在 webview 上启用文件拖放功能”,默认是 true,但在 Windows 下只有为 false 的时候才能在前端正确处理拖放事件。

至于如何做平台的判断,文档也没说。。。

解决 Tauri 文件拖放无效问题
https://blog.erio.work/posts/解决tauri文件拖放无效问题/
作者
Dupfioire
发布于
2025-04-01
许可协议
CC BY-NC-SA 4.0