노드에서 첨부 된 파일은 노드에서 제거 된 후에도 서버에서 삭제되지 않으며 편집 내용이 저장됩니다. Drupal 7


10

내 사이트에서 이상한 것을 발견했습니다. 파일을 노드에 첨부하면 (일반 파일 필드를 통해) 해당 파일이 서버에서 삭제되지 않습니다 . 노드에서 제거하고 변경 사항을 저장하지만 파일이 여전히 서버에 있음을 알 수 있습니다.

사용자가 대체 파일을 첨부하려고 할 때 파일 이름에 "_0"또는 "_1"접미사가 붙기 때문에 파일을 대체하기가 매우 어려워집니다 (원래 파일이 여전히 서버에 있고 이름이 중복되므로) . 즉, 파일에 대한 모든 링크를 찾아서 새 파일 이름 / url과 일치하도록 각 링크를 편집해야합니다. 총 혼란입니다.

온라인으로보고 있는데 아무도이 문제가없는 것 같습니다. 파일이 노드에서 제거되면 서버에서 파일을 삭제해야합니다.

내 경우에 왜 이런 일이 발생할 수 있습니까? 어디서부터 시작해야할지 모르겠습니다. 확실히 '파일 시스템'구성 페이지에는 확인되었을 수있는 옵션과 같은 특성이 없습니다. 그리고 필드 옵션 자체에는 내가 의도하지 않은 설정을하지 않은 것 같습니다. 다른 아이디어가 있습니까?


올바르게 이해하면 즉시 삭제되지 않지만 삭제 표시됩니다. 표시되면 cron 실행시 정리됩니다. 테이블 정리의 경우도 마찬가지입니다.
junedkazi

좋은 생각이야 나는 그것을 테스트했지만 파일은 여러 cron이 실행 된 후에도 삭제되지 않습니다.
Boriana Ditcheva

답변:


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

원래 요청에 대한 답은 찾지 못했지만 그 자리에 닿았습니다. 공유해 주셔서 감사합니다!
texas-bronius


0

서버의 권한 문제 일 수 있습니다. 새로 설치시 동일한 작업을 시도하십시오. 동일한 문제가 발생하면 Drupal이 아닌 서버에 달려 있습니다.

로그에 어떤 것이 있습니까?


방금 권한 문제를 테스트했습니다. 개인용 컴퓨터에 사이트의 로컬 사본이 있으며 문제도 있습니다. 그러나 새로 설치하면 파일이 실제로 삭제됩니다. 문제가있는 사이트에서 첨부 된 전체 노드를 삭제 한 후에도 파일이 삭제되지 않습니다. Drupal 설정에서이를 일으킬 수있는 다른 아이디어가 있습니까? 모듈이어야한다고 가정하고 있습니다.
Boriana Ditcheva

최소한 설치로 좁혔습니다. 어떤 모듈을 사용하고 있습니까? 모든 커스텀 / 포크 / dev 모듈?
Aram Boyajyan

0

이전 수정본을 삭제하거나 첨부 파일없이 노드를 저장하고 다시 돌아 오는 것에 대해 운이 없었습니다. 이것들은 항상 작동하는 유일한 것입니다.

  1. 노드 삭제
  2. 노드 편집을 통해 파일을 제거하고 서버에서 파일을 수동으로 삭제합니다.

나는 두 번째 옵션을 절대적으로 싫어하기 때문에 다른 해결책을 찾고 있습니다.

(D6을 실행하는 많은 클라이언트가 있기 때문에 범위를 벗어날 수도 있습니다.)


drupal.org/node/1816584 에 대한 티켓을 오래 전에 시작했습니다 . 원한다면 소리를 내고, 추가 목소리가 있다면 이것에 대해 더 진지한 토론이있을 수 있습니다.
Boriana Ditcheva

0

워크 벤치 검토와 함께이 문제에 부딪 쳤으며 동일한 이름의 파일을 다른 버전의 문서로 다시 업로드 할 때 실제로 업로드 된 파일의 이전 버전을 보여주는 파일 필드 삽입이 실제로 나타났습니다.

작업을 원활하게 수행하려면 노드의 vid를 파일 업로드 경로에 폴더로 추가하십시오. 일반적으로 나는 같은 일을하고 있습니다.

폴더 경로 = 자산 / [노드 : nid]-[노드 : 제목] / [노드 : vid]

예, 하위 폴더 광기를 가진 추한 폴더이지만 노드 ID 또는 제목을 통해 파일을 쉽게 찾을 수 있으며 하위 폴더는 이름 충돌을 방지하므로 동일한 파일의 여러 버전을 동일한 이름으로 유지할 수 있습니다. 그런 다음 나중에 공간을 정리하려는 경우 이전 개정을 삭제할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.