ไฟล์ที่แนบกับโหนดนั้นจะไม่ถูกลบออกจากเซิร์ฟเวอร์แม้ว่าจะถูกลบออกจากโหนดแล้วก็ตามและ 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

อย่างน้อยคุณก็ทำให้มันแคบลงจนถึงการติดตั้ง คุณใช้โมดูลใด โมดูล custom / fork / dev ใด ๆ ?
Aram Boyajyan

0

ฉันไม่มีโชคกับการลบการแก้ไขเก่าหรือการบันทึกโหนดโดยไม่มีไฟล์แนบและกลับมา สิ่งเหล่านี้เป็นสิ่งเดียวที่ใช้งานได้:

  1. การลบโหนด
  2. การลบไฟล์ผ่านการแก้ไขโหนดและการลบไฟล์ออกจากเซิร์ฟเวอร์ด้วยตนเอง

ฉันเกลียดตัวเลือกที่สองซึ่งเป็นสาเหตุที่ฉันกำลังมองหาวิธีแก้ไขปัญหาอื่นอยู่ที่นี่

(ฉันอาจจะก้าวออกจากขอบเขตเช่นกันเนื่องจากฉันมีลูกค้าจำนวนมากที่ใช้ D6)


ผมเริ่มตั๋วเกี่ยวกับเรื่องนี้มานานแล้ว: drupal.org/node/1816584 พูดสอดหากคุณต้องการและอาจมีการพูดคุยอย่างจริงจังเกี่ยวกับเรื่องนี้หากมีเสียงเพิ่มเติม
Boriana Ditcheva

0

ฉันพบปัญหานี้เช่นกันกับการปรับแต่ง workbench และการแทรกฟิลด์ไฟล์จะแสดงไฟล์ที่อัปโหลดเวอร์ชันเก่าจริง ๆ เมื่อไฟล์ที่มีชื่อเดียวกันถูกอัปโหลดใหม่ในการแก้ไขเอกสารที่แตกต่างกัน

เพื่อให้สิ่งต่าง ๆ ทำงานได้อย่างราบรื่นให้เพิ่ม vid ของโหนดเป็นโฟลเดอร์ไปยังเส้นทางการอัปโหลดไฟล์ ปกติฉันจะทำอะไรซักอย่าง

เส้นทางโฟลเดอร์ = สินทรัพย์ / [โหนด: nid] - [node: title] / [โหนด: vid]

ใช่มันเป็นโฟลเดอร์ที่น่าเกลียดที่มีความบ้าคลั่งของโฟลเดอร์ย่อย แต่คุณสามารถค้นหาไฟล์ได้อย่างง่ายดายผ่าน node ID หรือหัวเรื่องจากนั้นโฟลเดอร์ย่อยจะป้องกันการชนกันของชื่อเพื่อให้คุณสามารถเก็บไฟล์เดียวกันหลายเวอร์ชันด้วยชื่อเดียวกัน จากนั้นคุณสามารถลบการแก้ไขเดิมได้ในภายหลังหากคุณต้องการล้างพื้นที่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.