I file allegati ai nodi non vengono mai eliminati dal server anche dopo essere stati rimossi dal nodo (e la modifica è stata salvata), Drupal 7


10

Ho notato qualcosa di strano sul mio sito: dopo aver allegato un file a un nodo (tramite il campo file normale), quel file non viene mai cancellato dal server . Lo rimuovo dal nodo, salvo quella modifica, ma posso vedere che il file è ancora sul server.

Questo rende molto difficile la sostituzione dei file, perché quando un utente tenta di allegare una sostituzione, il nome del file ha il suffisso "_0" o "_1" (poiché il file originale è ancora sul server e ciò rende il nome un duplicato) . Ciò significa che dovremmo trovare tutti i collegamenti al file e modificarli ciascuno in modo che corrisponda al nuovo nome / URL del file. È un casino totale.

Sto cercando online e nessuno sembra avere questo problema: i file dovrebbero essere eliminati dal server una volta rimossi dal nodo.

Qualche idea sul perché questo possa accadere nel mio caso? Non sono sicuro da dove iniziare a cercare. Certamente la pagina di configurazione del "File system" non ha nulla del genere come opzione che potrebbe essere stata verificata. E le stesse opzioni sul campo sembrano non avere nulla di quella natura che potrei aver impostato inavvertitamente. Altre idee?


Se capisco correttamente, non viene eliminato immediatamente ma è contrassegnato per l'eliminazione. Una volta contrassegnato, viene ripulito durante l'esecuzione cron. Lo stesso vale per la pulizia delle tabelle.
Junedkazi,

Pensare bene. L'ho provato però, e i file non vengono mai eliminati, nemmeno dopo diverse esecuzioni cron.
Boriana Ditcheva,

Risposte:


17

Capito! È una cosa delle revisioni. Immagino abbia senso. Se hai revisioni abilitate per quel tipo di contenuto, mantiene tutti i tuoi vecchi file sul server (associati a vecchie revisioni), quindi la sostituzione di un file è sicuramente più difficile. Se si tenta di rimuoverlo e aggiungerlo di nuovo al nodo, il nome / collegamento viene aggiornato, come ho detto nella mia domanda. Poiché un file con quel nome viene mantenuto sul server e c'è una duplicazione del nome, aggiunge i suffissi "_0", "_1" ecc. Alle future versioni caricate del nome di quel file.

Capisco perché questo stia accadendo, dal momento che l'intero punto di revisione è in grado di tornare a qualsiasi versione passata della pagina.

La soluzione è che puoi effettivamente eliminare la vecchia revisione dalla scheda 'Revision' o 'Moderate' (se usi la moderazione Workbench) che conteneva il file che stai cercando di sostituire. Quindi caricalo di nuovo e il nome dovrebbe corrispondere senza che tu debba tornare indietro e modificare i collegamenti che puntano a quel file.

Spero che abbia un senso e che aiuti anche qualcun altro!


4

Ho avuto lo stesso caso d'uso (volendo sostituire i file mantenendo il nome del file) e il seguente codice in un modulo personalizzato ha raggiunto questo obiettivo. Questo codice si basa sul modulo API Entity, pertanto deve essere aggiunto come dipendenza nel file .info del modulo. Feedback di benvenuto.

Ciò consente di eliminare immediatamente i file dopo aver fatto clic su "Rimuovi" e quindi aver salvato il nodo. Avviso: ciò significa anche che quando si rimuove un file e si salva il nodo, non è possibile recuperare quel file eseguendo il rollback a una revisione precedente.

/**
 * 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);
        }
      }
    }
  }
}

dove dovremmo inserire il codice.
BandOfBrothers il

Non era la risposta alla richiesta originale che cercavo, ma l'ho trovata sul posto giusto. Grazie per aver condiviso qui!
texas-bronius,


0

Questo potrebbe essere un problema di autorizzazioni sul server. Prova lo stesso su un'installazione pulita: se stai riscontrando lo stesso problema, dipende dal server e non da Drupal.

C'è qualcosa nei registri?


L'ho appena testato per problemi di autorizzazione. Ho una copia locale del sito sul mio computer personale e il problema esiste anche lì. Tuttavia, su un'installazione pulita, i file vengono effettivamente eliminati. Sul mio sito problematico, i file non vengono eliminati anche dopo aver eliminato l'intero nodo a cui sono collegati. Qualche altra idea di cosa potrebbe causare questo nella mia configurazione di Drupal.
Suppongo

Almeno l'hai ristretto all'installazione. Quali moduli stai usando? Qualche modulo personalizzato / fork / dev?
Aram Boyajyan,

0

Non ho avuto fortuna con la cancellazione di vecchie revisioni o il salvataggio di nodi senza i file allegati e il ritorno. Queste sono le uniche cose che funzionano sempre:

  1. Eliminazione del nodo
  2. Rimozione del file mediante la modifica del nodo e l'eliminazione manuale del file dal server.

Odio assolutamente la seconda opzione, motivo per cui sono qui alla ricerca di un'altra soluzione.

(Potrei anche uscire dai limiti, dato che ho un sacco di clienti che eseguono D6.)


Ho iniziato un biglietto su questo molto tempo fa: drupal.org/node/1816584 . Chong in se vuoi, e forse ci può essere una discussione più seria su questo se ci sono voci aggiuntive.
Boriana Ditcheva,

0

Ho riscontrato questo problema anche con la moderazione del workbench e l'inserimento del campo file mostra in realtà le vecchie versioni dei file caricati quando i file con lo stesso nome vengono ricaricati in diverse revisioni di un documento.

Per far funzionare le cose senza problemi, aggiungi il vid del nodo come cartella al percorso di caricamento del file. Normalmente sto facendo qualcosa del genere.

Percorso cartella = risorse / [nodo: nid] - [nodo: titolo] / [nodo: vid]

Sì, sono brutte cartelle lunghe con follia di sottocartella, ma puoi trovare i file molto facilmente tramite ID nodo o titolo, quindi la sottocartella impedisce le collisioni di nomi in modo da poter mantenere molte versioni dello stesso file con lo stesso nome. Quindi in seguito è possibile eliminare le vecchie revisioni se si desidera ripulire lo spazio.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.