Los archivos adjuntos a los nodos nunca se eliminan del servidor incluso después de que se eliminan del nodo (y esa edición se guarda), Drupal 7


10

He notado algo extraño en mi sitio: después de adjuntar un archivo a un nodo (a través del campo de archivo normal), ese archivo nunca se elimina del servidor . Lo elimino del nodo, guardo ese cambio, pero puedo ver que el archivo todavía está en el servidor.

Esto hace que reemplazar archivos sea muy difícil, porque cuando un usuario intenta adjuntar un reemplazo, el nombre del archivo tiene el sufijo "_0" o "_1" (ya que el archivo original todavía está en el servidor y eso hace que el nombre sea un duplicado) . Eso significa que necesitaríamos encontrar todos los enlaces al archivo y editar cada uno para que coincida con el nuevo nombre de archivo / url. Es un desastre total.

Estoy buscando en línea y nadie parece tener este problema: los archivos deben eliminarse del servidor una vez que se eliminan del nodo.

¿Alguna idea de por qué esto puede estar sucediendo en mi caso? No estoy seguro de por dónde empezar a buscar. Ciertamente, la página de configuración 'Sistema de archivos' no tiene nada de esa naturaleza como una opción que puede haber sido verificada. Y las opciones de campo en sí mismas parecen no tener nada de esa naturaleza que pueda haber configurado inadvertidamente. ¿Alguna otra idea?


Si entiendo correctamente, no se elimina de inmediato, pero está marcado para su eliminación. Una vez que está marcado, se limpia en la ejecución cron. Igual es el caso con la limpieza de tablas.
junedkazi

Buen pensamiento. Sin embargo, lo probé y los archivos nunca se eliminan, ni siquiera después de varias ejecuciones cron.
Boriana Ditcheva

Respuestas:


17

¡Lo tengo! Es una cosa de revisiones. Supongo que tiene sentido. Si tiene habilitadas las revisiones para ese tipo de contenido, mantiene todos sus archivos antiguos en el servidor (asociados con revisiones antiguas), por lo que reemplazar un archivo definitivamente es más difícil. Si intenta eliminarlo y agregarlo nuevamente al nodo, el nombre / enlace se actualiza, como mencioné en mi pregunta. Dado que un archivo con ese nombre se mantiene en el servidor y hay una duplicación de nombre, agrega esos sufijos "_0", "_1", etc. a futuras versiones cargadas del nombre de ese archivo.

Sin embargo, entiendo por qué sucede esto, ya que todo el punto de revisión es poder volver a cualquier versión anterior de la página.

La solución es que en realidad puede eliminar la revisión anterior de la pestaña 'Revisión' o 'Moderar' (si usa Workbench Moderation) que contenía el archivo que está tratando de reemplazar. Luego, cárguelo nuevamente, y el nombre debería coincidir sin tener que regresar y editar los enlaces que apuntan a ese archivo.

¡Espero que tenga sentido y que también ayude a alguien más!


4

Tuve el mismo caso de uso (queriendo reemplazar archivos manteniendo el nombre de archivo), y el siguiente código en un módulo personalizado cumplió este objetivo. Este código se basa en el módulo Entity API , por lo que debe agregarse como una dependencia en el archivo .info de su módulo. Comentarios bienvenidos.

Esto permite eliminar archivos inmediatamente después de hacer clic en 'Eliminar' y luego guardar el nodo. Advertencia: esto también significa que cuando elimina un archivo y guarda el nodo, no puede recuperar ese archivo volviendo a una revisión anterior.

/**
 * Implements hook_node_update().
 *
 * Delete files from old node revisions.
 */
function MYMODULE_node_update($node) {
  // Array of content types to act on.
  if (in_array($node->type, array('page', 'article'))) {
    $wrapper = entity_metadata_wrapper('node', $node);
    $original_wrapper = entity_metadata_wrapper('node', $node->original);

    // Array of file fields to act on.
    foreach (array('field_public_files', 'field_private_files') as $field) {
      if (!isset($original_wrapper->{$field})) {
        continue;
      }
      $current_files = array();
      $original_files = array();
      // Get files that were attached to the original node (before update).
      foreach ($original_wrapper->{$field}->value() as $file) {
        $original_files[] = $file['fid'];
      }
      // Stop if there were no files previously attached.
      if (empty($original_files)) {
        continue;
      }
      // Get files currently attached to the node (after update).
      foreach ($wrapper->{$field}->value() as $file) {
        $current_files[] = $file['fid'];
      }
      // Delete files that were in the original node but were removed during
      // this update.
      $deleted_files = array_diff($original_files, $current_files);
      foreach ($deleted_files as $fid) {
        if ($file = file_load($fid)) {
          // Delete all usages of the file. Each node revision adds to the usage
          // count.
          file_usage_delete($file, 'file', 'node', $node->nid, 0);
          file_delete($file);
        }
      }
    }
  }
}

donde deberíamos poner el código.
BandOfBrothers

No era la respuesta que buscaba la solicitud original, pero encontré que dio en el clavo. Gracias por compartir aquí!
texas-bronius


0

Esto podría ser un problema de permisos en el servidor. Pruebe lo mismo en una instalación limpia: si tiene el mismo problema, entonces depende del servidor y no de Drupal.

¿Hay algo en los registros?


Acabo de probarlo por problemas de permisos. Tengo una copia local del sitio en mi máquina personal, y el problema también existe allí. Sin embargo, en una instalación limpia, los archivos se eliminan. En mi sitio problemático, los archivos no se eliminan incluso después de eliminar todo el nodo al que están conectados. Cualquier otra idea que pueda estar causando esto en mi configuración de Drupal. Supongo que debe ser un módulo ...
Boriana Ditcheva

Al menos lo redujo a la instalación. ¿Qué módulos estás usando? ¿Algún módulo personalizado / fork / dev?
Aram Boyajyan

0

No tuve suerte al eliminar revisiones antiguas o guardar nodos sin sus archivos adjuntos y volver. Estas son las únicas cosas que siempre funcionan:

  1. Eliminar el nodo
  2. Eliminar el archivo editando el nodo y eliminando manualmente el archivo del servidor.

Absolutamente odio la segunda opción, por eso estoy buscando otra solución.

(También podría estar saliendo de los límites, ya que tengo un montón de clientes que ejecutan D6).


Comencé un boleto sobre esto hace mucho tiempo: drupal.org/node/1816584 . Interviene si lo desea, y tal vez pueda haber una discusión más seria sobre esto si hay voces adicionales.
Boriana Ditcheva

0

También me encontré con este problema con la moderación del banco de trabajo, y la inserción del campo de archivo que en realidad muestra las versiones antiguas de los archivos cargados cuando los archivos con el mismo nombre se vuelven a cargar en diferentes revisiones de un documento.

Para que las cosas funcionen sin problemas, agregue el vid del nodo como una carpeta a la ruta de carga del archivo. Normalmente estoy haciendo algo así.

Ruta de la carpeta = activos / [nodo: nid] - [nodo: título] / [nodo: vid]

Sí, son carpetas largas y feas con locura de subcarpetas, pero puede encontrar archivos muy fácilmente a través de ID o título de nodo, y luego la subcarpeta evita colisiones de nombres para que pueda mantener muchas versiones del mismo archivo con el mismo nombre. Luego, puede eliminar las revisiones anteriores si desea limpiar el espacio.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.