es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , , , ,

Answer

  1. Avatar for 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:

    function generateFolderStructure(fileList) {
      let folderStructure = {};
    
      for(let i = 0; i < fileList.length; i++) {
        const item = fileList[i];
        if(item.type === "directory") {
          folderStructure[item.path] = {};
          folderStructure[item.path] = generateFolderStructure(item.children);
        } else {
          folderStructure[item.path] = item;
        }
      }
    
      return folderStructure;
    }
    

    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ón generateFolderStructure 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:

    const onDrop = useCallback((acceptedFiles, folderStructure) => {
      console.log(acceptedFiles, folderStructure);
    }, []);
    
    const { getRootProps, getInputProps, isDragActive } = useDropzone({
      onDrop: (acceptedFiles) => {
        const fileList = acceptedFiles.map(file => {
          return {
            type: file.type,
            path: file.path,
            children: file.children,
          }
        });
        const folderStructure = generateFolderStructure(fileList);
        onDrop(acceptedFiles, folderStructure);
      },
      getFilesFromEvent: (event) => myCustomFileGetter(event),
    });
    

    Aquí, la función onDrop se modifica para tomar el parámetro folderStructure junto con los archivos aceptados. La variable fileList se crea mapeando los archivos aceptados y convirtiéndolos al formato utilizado por la función generateFolderStructure. Luego, se llama a la función generateFolderStructure con el parámetro fileList 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ón onDrop.

    Con esta solución, deberías poder manejar carpetas vacías y su estructura al cargarlas usando React-dropzone.

Comments are closed.