Các tệp được đính kèm với các nút không bao giờ bị xóa khỏi máy chủ ngay cả sau khi chúng bị xóa khỏi nút (và chỉnh sửa đó được lưu), Drupal 7


10

Tôi đã nhận thấy một điều kỳ lạ trên trang web của mình: sau khi đính kèm tệp vào một nút (thông qua trường tệp thông thường), tệp đó không bao giờ bị xóa khỏi máy chủ . Tôi loại bỏ nó khỏi nút, lưu thay đổi đó, nhưng tôi có thể thấy tập tin vẫn còn trên máy chủ.

Điều này làm cho việc thay thế tệp rất khó khăn, vì khi người dùng cố gắng đính kèm thay thế, tên tệp có hậu tố "_0" hoặc "_1" (vì tệp gốc vẫn ở trên máy chủ và điều đó làm cho tên trùng lặp) . Điều đó có nghĩa là chúng ta sẽ cần tìm tất cả các liên kết đến tệp và chỉnh sửa từng liên kết để khớp với tên / url tệp mới. Đó là một mớ hỗn độn.

Tôi đang tìm kiếm trực tuyến và dường như không ai gặp phải vấn đề này - các tệp phải bị xóa khỏi máy chủ sau khi chúng bị xóa khỏi nút.

Bất kỳ ý tưởng tại sao điều này có thể xảy ra trong trường hợp của tôi? Tôi không chắc bắt đầu tìm ở đâu. Chắc chắn trang cấu hình system Hệ thống tệp 'không có gì thuộc tính đó là một tùy chọn có thể đã được kiểm tra. Và bản thân các tùy chọn trường dường như không có bất cứ thứ gì thuộc về bản chất mà tôi có thể đã vô tình đặt ra. Còn ý tưởng nào khác không?


Nếu tôi hiểu chính xác thì nó không bị xóa ngay lập tức nhưng nó được đánh dấu để xóa. Một khi nó được đánh dấu, nó được dọn sạch trên cron run. Tương tự là trường hợp với các bảng dọn dẹp.
Junedkazi

Suy nghĩ tốt. Tôi đã kiểm tra điều đó mặc dù và các tệp không bao giờ bị xóa, ngay cả sau khi chạy vài cron.
Boriana Ditcheva

Câu trả lời:


17

Tôi hiểu rồi! Đó là một điều chỉnh sửa. Tôi đoán nó có ý nghĩa. Nếu bạn đã bật các phiên bản cho loại nội dung đó, nó sẽ giữ tất cả các tệp cũ của bạn trên máy chủ (được liên kết với các bản sửa đổi cũ), vì vậy việc thay thế một tệp chắc chắn khó hơn. Nếu bạn cố gắng loại bỏ nó và thêm nó một lần nữa vào nút, tên / liên kết sẽ được cập nhật, như tôi đã đề cập trong câu hỏi của mình. Vì một tệp có tên đó được lưu trên máy chủ và có sự trùng lặp tên, nên nó thêm các hậu tố "_0", "_1" vv vào các phiên bản được tải lên trong tương lai của tên tệp đó.

Tôi hiểu tại sao điều này xảy ra mặc dù, vì toàn bộ điểm sửa đổi là có thể trở lại bất kỳ phiên bản nào trong quá khứ của trang.

Cách giải quyết là bạn thực sự có thể xóa bản sửa đổi cũ khỏi tab 'Sửa đổi' hoặc 'Kiểm duyệt' (nếu sử dụng Kiểm duyệt bàn làm việc) có chứa tệp bạn đang cố thay thế. Sau đó tải lên lại và tên sẽ khớp với nhau mà bạn không cần phải quay lại và chỉnh sửa bất kỳ liên kết nào trỏ đến tệp đó.

Hy vọng rằng có ý nghĩa và nó cũng giúp người khác!


4

Tôi đã có trường hợp sử dụng tương tự (muốn thay thế các tệp trong khi duy trì tên tệp) và mã sau đây trong mô-đun tùy chỉnh đã đáp ứng mục tiêu này. Mã này dựa trên mô-đun Entity API để nó phải được thêm dưới dạng phụ thuộc trong tệp .info mô-đun của bạn. Phản hồi chào mừng.

Điều này cho phép xóa ngay các tệp sau khi nhấp vào 'Xóa' rồi lưu nút. Cảnh báo: điều này cũng có nghĩa là khi bạn Xóa một tệp và lưu nút, bạn không thể lấy lại tệp đó bằng cách quay lại bản sửa đổi trước đó.

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

nơi chúng ta nên đặt mã.
BandOfBrothers

Không phải câu trả lời yêu cầu ban đầu đang tìm kiếm, nhưng tôi thấy nó chỉ đạt được điểm. Cảm ơn đã chia sẻ ở đây!
texas-bronius


0

Đây có thể là một vấn đề quyền trên máy chủ. Hãy thử tương tự trên một bản cài đặt sạch - nếu bạn đang gặp vấn đề tương tự, thì tùy thuộc vào máy chủ chứ không phải Drupal.

Có bất cứ điều gì trong các bản ghi?


Tôi chỉ kiểm tra nó cho các vấn đề cho phép. Tôi có một bản sao cục bộ của trang web trên máy cá nhân của mình và vấn đề cũng tồn tại ở đó. Tuy nhiên, trên một cài đặt sạch, các tập tin thực sự bị xóa. Trên trang web có vấn đề của tôi, các tệp không bị xóa ngay cả sau khi tôi xóa toàn bộ nút mà chúng được đính kèm. Bất kỳ ý tưởng nào khác có thể gây ra điều này trong thiết lập Drupal của tôi. Tôi cho rằng nó phải là một mô-đun ...
Boriana Ditcheva

Ít nhất bạn đã thu hẹp nó xuống để cài đặt. Những mô-đun bạn đang sử dụng? Bất kỳ mô-đun tùy chỉnh / fork / dev?
Aram Boyajyan

0

Tôi đã không gặp may mắn với việc xóa các bản sửa đổi cũ hoặc lưu các nút mà không có tệp đính kèm của chúng và quay lại. Đây là những điều duy nhất luôn hoạt động:

  1. Xóa nút
  2. Xóa tệp thông qua chỉnh sửa nút và xóa tệp thủ công khỏi máy chủ.

Tôi hoàn toàn ghét lựa chọn thứ hai, đó là lý do tại sao tôi ở đây tìm kiếm một giải pháp khác.

(Tôi cũng có thể bước ra khỏi giới hạn vì tôi có một nhóm khách hàng đang chạy D6.)


Tôi đã bắt đầu một vé về điều này từ lâu: drupal.org/node/1816584 . Chime trong nếu bạn muốn, và có lẽ có thể có một cuộc thảo luận nghiêm túc hơn về điều này nếu có thêm tiếng nói.
Boriana Ditcheva

0

Tôi cũng gặp phải vấn đề này với kiểm duyệt bàn làm việc và trường chèn tệp thực sự hiển thị các phiên bản cũ của tệp được tải lên khi các tệp có cùng tên được tải lên lại trong các phiên bản khác nhau của tài liệu.

Để làm cho mọi thứ chạy trơn tru, hãy thêm vid của nút làm thư mục vào đường dẫn tải lên tệp. Thông thường tôi đang làm một cái gì đó như.

Đường dẫn thư mục = tài sản / [nút: nid] - [nút: title] / [nút: vid]

Đúng, chúng là những thư mục dài xấu xí với sự điên cuồng của thư mục con, nhưng bạn có thể tìm thấy các tệp thực sự dễ dàng thông qua ID hoặc tiêu đề nút, và sau đó thư mục con ngăn chặn xung đột tên để bạn có thể giữ nhiều phiên bản của cùng một tệp. Sau đó, bạn có thể xóa các bản sửa đổi cũ nếu bạn muốn dọn sạch không gian.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.