即使将附加到节点的文件从节点中删除(并且已保存该编辑),也永远不会从服务器中删除它们,Drupal 7


10

我在网站上注意到了一件奇怪的事情:将文件附加到节点上(通过常规文件字段)后,该文件再也不会从服务器上删除。我从节点上将其删除,并保存了更改,但是我可以看到文件仍在服务器上。

这使替换文件非常困难,因为当用户尝试附加替换文件时,文件名后缀有“ _0”或“ _1”(因为原始文件仍在服务器上,并且使该名称重复) 。这意味着我们需要找到该文件的所有链接,并编辑每个链接以匹配新的文件名/ URL。真是一团糟。

我正在上网,似乎没有人遇到这个问题-一旦从节点中删除了文件,就应该从服务器上删除它们。

任何想法为什么在我的情况下可能会发生?我不确定从哪里开始寻找。当然,“文件系统”配置页没有这种性质,因为它可能已经被选中。而且字段选项本身似乎没有我可能不小心设置的那种性质。还有其他想法吗?


如果我理解正确,它不会立即删除,但会标记为删除。标记后,将在cron运行中对其进行清理。表清理也是如此。
junedkazi 2012年

好想法。我确实进行了测试,并且文件从未被删除,即使经过几次cron也是如此。
Boriana Ditcheva

Answers:


17

我知道了!这是修订的事情。我想这很有道理。如果您为该内容类型启用修订,则它将所有旧文件保留在服务器上(与旧修订相关联),因此替换文件肯定更难。如果您尝试删除它并将其再次添加到节点,则名称/链接将更新,正如我在问题中提到的那样。由于具有该名称的文件将保留在服务器上,并且存在名称重复,因此会将那些“ _0”,“ _ 1”等后缀添加到该文件名称的将来上载版本中。

我知道为什么会这样,因为整个修订过程都可以恢复到该页面的任何过去版本。

解决方法是,您实际上可以从包含要替换文件的“修订”或“中等”选项卡(如果使用工作台审核)中删除旧修订。然后,再次上传它,然后该名称应匹配,而无需回去编辑指向该文件的任何链接。

希望这有道理,也可以帮助其他人!


4

我有相同的用例(想要在保持文件名的同时替换文件),并且自定义模块中的以下代码满足了这一目标。此代码依赖于Entity API模块,因此应作为依赖项添加到模块.info文件中。欢迎反馈。

这允许单击“删除”然后保存节点后立即删除文件。警告:这也意味着当您删除文件并保存节点时,无法通过回滚到较早的修订版本来获取该文件。

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

我们应该在哪里放置代码。
BandOfBrothers

不是原始请求所要的答案,但我发现它恰到好处。感谢您在这里分享!
德克萨斯州布罗尼厄斯


0

这可能是服务器上的权限问题。在全新安装上尝试相同的操作-如果遇到相同的问题,则取决于服务器而不是Drupal。

日志中有什么吗?


我只是测试了权限问题。我的个人计算机上有该站点的本地副本,那里也存在问题。但是,在全新安装中,确实确实会删除文件。在我有问题的站点上,即使删除了文件所附加的整个节点,文件也不会被删除。任何其他想法可能会导致我的Drupal设置出现此问题。我假设它必须是一个模块...
Boriana Ditcheva

至少您将其范围缩小到了安装范围。您正在使用哪些模块?任何自定义/叉/开发模块?
Aram Boyajyan 2012年

0

我没有删除旧修订版或保存没有附加文件并返回的节点的运气。这些是始终有效的唯一事物:

  1. 删除节点
  2. 通过编辑节点来删除文件,然后从服务器中手动删除文件。

我绝对讨厌第二种选择,这就是为什么我在这里寻找另一种解决方案的原因。

(由于我有一堆运行D6的客户端,所以我也可能会越界。)


很久以前,我就开始对此票了:drupal.org/node/1816584。如果您愿意,请加入,如果有其他声音,也许可以对此进行更认真的讨论。
Boriana Ditcheva

0

我在工作台审核中也遇到了这个问题,当在不同版本的文档中重新上传具有相同名称的文件时,文件字段插入实际上显示了已上传文件的旧版本。

为了使事情顺利进行,请将节点的vid作为文件夹添加到文件上载路径。通常我在做类似的事情。

文件夹路径=资产/ [node:nid]-[node:title] / [node:vid]

是的,它们是丑陋的长文件夹,带有子文件夹疯狂,但是您可以通过节点ID或标题真正轻松地找到文件,然后子文件夹防止名称冲突,因此您可以保留同一名称的多个文件版本。然后,如果您想清理空间,则可以在以后删除旧版本。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.