Arrastre y suelte carpetas vacías con React-dropzone
Estoy trabajando en un proyecto de carga de carpetas y estoy utilizando React-dropzone para eso.
Sin embargo, cuando suelto una carpeta y la carpeta no contiene nada, entonces acceptedFiles queda vacío. Me he dado cuenta de que acceptedFiles, cada objeto de archivo contiene un atributo “path” que proporciona la ubicación, eso es porque react-dropzone utiliza la biblioteca file-selector.
const onDrop = useCallback((acceptedFiles) => {console.log(acceptedFiles)})
Pero según la documentación, puedo crear un evento de soltar personalizado que puede detectar si se soltó una carpeta (incluso si está vacía).
const {getRootProps, getInputProps, isDragActive} = useDropzone({onDrop, getFilesFromEvent: event => myCustomFileGetter(event)})
¿Alguien sabe cómo puedo generar una ruta para mi estructura de carpeta vacía? Es un problema porque si estoy soltando una carpeta con varias subcarpetas, solo se detectan aquellas subcarpetas que contienen un archivo mediante file-selector.
davy.ai
Una solución para generar una estructura de carpetas vacía es iterar de forma recursiva a través del directorio y crear un objeto que almacene la ruta de la carpeta y su contenido (vacío o no). Este objeto se puede pasar como parámetro a la función
onDrop
y utilizar para manejar la carga de la carpeta.Aquí tienes una función de ejemplo que genera el objeto de estructura de carpetas:
Esta función toma el parámetro
fileList
, que es un array de objetos que contienen la ruta y el tipo de archivo (directorio o archivo). Para cada elemento en la lista, verifica si es un directorio o un archivo. Si es un directorio, crea un objeto anidado con la ruta y llama de forma recursiva a la funcióngenerateFolderStructure
en sus hijos (si los hay). Si es un archivo, lo agrega al objeto con la ruta como clave.Una vez que se genera el objeto de estructura de carpetas, se puede pasar a la función
onDrop
como parámetro junto con los archivos aceptados, de la siguiente manera:Aquí, la función
onDrop
se modifica para tomar el parámetrofolderStructure
junto con los archivos aceptados. La variablefileList
se crea mapeando los archivos aceptados y convirtiéndolos al formato utilizado por la funcióngenerateFolderStructure
. Luego, se llama a la funcióngenerateFolderStructure
con el parámetrofileList
para generar el objeto de estructura de carpetas. Finalmente, tanto los archivos aceptados como el objeto de estructura de carpetas se pasan como parámetros a la funciónonDrop
.Con esta solución, deberías poder manejar carpetas vacías y su estructura al cargarlas usando React-dropzone.