नोड से जुड़ी फाइलें नोड से हटाए जाने के बाद भी सर्वर से कभी भी डिलीट नहीं की जाती हैं (और वह संपादन बच जाता है), Drupal 7


10

मैंने अपनी साइट पर कुछ अजीब देखा है: किसी फ़ाइल को नोड (नियमित फ़ाइल फ़ील्ड के माध्यम से) में संलग्न करने के बाद, वह फ़ाइल सर्वर से कभी भी डिलीट नहीं होती है । मैं इसे नोड से हटाता हूं, उस परिवर्तन को सहेजता हूं, लेकिन मैं देख सकता हूं कि फाइल अभी भी सर्वर पर है।

इससे फ़ाइलों को बदलना बहुत मुश्किल हो जाता है, क्योंकि जब कोई उपयोगकर्ता किसी प्रतिस्थापन को संलग्न करने का प्रयास करता है, तो फ़ाइल नाम में "_0" या "_1" होता है जो इसे प्रत्यय देता है (क्योंकि मूल फ़ाइल अभी भी सर्वर पर है और यह नाम को डुप्लिकेट बनाता है) । इसका मतलब है कि हमें फ़ाइल के सभी लिंक ढूंढने होंगे और नए फ़ाइल नाम / यूआरएल से मिलान करने के लिए प्रत्येक को संपादित करना होगा। यह कुल गड़बड़ है।

मैं ऑनलाइन देख रहा हूं और किसी को भी यह समस्या नहीं है - नोड से हटाए जाने के बाद फ़ाइलों को सर्वर से हटा दिया जाना चाहिए।

किसी भी विचार क्यों मेरे मामले में ऐसा हो सकता है? मुझे यकीन नहीं है कि मैं कहाँ देखना शुरू करूँगा। निश्चित रूप से 'फ़ाइल सिस्टम' कॉन्फ़िगरेशन पृष्ठ में उस प्रकृति के विकल्प के रूप में कुछ भी नहीं है जिसे जांचा जा सकता है। और क्षेत्र के विकल्प खुद को उस प्रकृति की कुछ भी नहीं लगते हैं जो मैं अनजाने में सेट कर सकता हूं। कोई अन्य विचार?


अगर मैं सही तरीके से समझूं तो इसे तुरंत डिलीट नहीं किया जाता है बल्कि इसे डिलीट करने के लिए चिन्हित किया जाता है। एक बार जब यह चिह्नित हो जाता है तो इसे क्रोन रन पर साफ किया जाता है। टेबल क्लीनअप के मामले में भी ऐसा ही है।
जुनेदकाज़ी

अच्छी सोच। मैंने परीक्षण किया था कि हालांकि, और फ़ाइलों को कभी भी नष्ट नहीं किया जाता है, कई क्रोन रन के बाद भी नहीं।
बोरियाना डायचेवा

जवाबों:


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

उत्तर के मूल अनुरोध की तलाश नहीं थी, लेकिन मैंने पाया कि यह सिर्फ मौके पर पहुंच गया। यहाँ साझा करने के लिए धन्यवाद!
टेक्सास-ब्रोंस

2

मैंने एक मॉड्यूल बनाया जो अनाथ फ़ाइलों को इस धागे में बताए गए तरीके से हटाता है:

https://www.drupal.org/project/fancy_file_delete

यह मैन्युअल रूप से और संयुक्त रूप से प्रबंधित फ़ाइलों को हटाने के लिए भी मजबूर कर सकता है।


0

यह सर्वर पर अनुमतियों की समस्या हो सकती है। क्लीन इंस्टाल पर भी यही कोशिश करें - अगर आपको भी यही समस्या हो रही है, तो यह सर्वर पर निर्भर है न कि ड्रुपल पर।

क्या लॉग में कुछ है?


मैंने सिर्फ अनुमति की समस्याओं के लिए इसका परीक्षण किया। मेरे पास अपनी व्यक्तिगत मशीन पर साइट की एक स्थानीय प्रतिलिपि है, और समस्या वहां भी मौजूद है। हालाँकि, क्लीन इंस्टाल पर, फ़ाइलें वास्तव में डिलीट हो जाती हैं। मेरी समस्याग्रस्त साइट पर, वे पूरी नोड को हटाने के बाद भी फ़ाइलें नहीं हटतीं, जिनसे वे जुड़ी हुई हैं। मेरे Drupal सेटअप में इसके कारण क्या हो सकते हैं कोई अन्य विचार। मैं मान रहा हूं कि यह एक मॉड्यूल होना चाहिए ...
बोरियाना डिटेचेवा

कम से कम आपने इसे संस्थापन में सीमित कर दिया है। आप कौन से मॉड्यूल का उपयोग कर रहे हैं? कोई कस्टम / कांटा / देव मॉड्यूल?
अराम बोयाजयन

0

मेरे पास पुराने संशोधनों को हटाने या उनकी संलग्न फ़ाइलों के बिना नोड्स को बचाने और वापस आने के साथ किस्मत नहीं थी। ये एकमात्र ऐसी चीजें हैं जो हमेशा काम करती हैं:

  1. नोड को हटाना
  2. नोड को संपादित करके फ़ाइल को हटाना और मैन्युअल रूप से फ़ाइल को सर्वर से हटाना।

मैं दूसरे विकल्प से पूरी तरह से नफरत करता हूं, यही कारण है कि मैं यहां एक और समाधान ढूंढ रहा हूं।

(मैं सीमा से बाहर कदम रख सकता है, क्योंकि मेरे पास डी 6 चलाने वाले ग्राहकों का एक समूह है।)


मैंने इस बारे में बहुत पहले एक टिकट शुरू किया था: drupal.org/node/1816584 । यदि आप चाहें तो झंकार करें, और यदि अतिरिक्त आवाज़ें हैं, तो शायद इस बारे में अधिक गंभीर चर्चा हो सकती है।
बोरियाना डायचेवा

0

मैं इस समस्या के साथ ही कार्यक्षेत्र मॉडरेशन के साथ भाग गया, और फ़ाइल फ़ील्ड इंसर्ट वास्तव में अपलोड की गई फ़ाइलों के पुराने संस्करणों को दिखा रहा है जब एक ही नाम के साथ फाइल एक दस्तावेज़ के विभिन्न संशोधनों में पुन: अपलोड की जाती हैं।

चीजों को सुचारू रूप से चलाने के लिए नोड के vid को फाइल अपलोड पथ पर फ़ोल्डर के रूप में जोड़ें। आम तौर पर मैं कुछ ऐसा कर रहा हूं।

फ़ोल्डर पथ = संपत्ति / [नोड: nid] - [नोड: शीर्षक] / [नोड: vid]

हाँ, वे उप फ़ोल्डर पागलपन के साथ बदसूरत लंबे फ़ोल्डर हैं, लेकिन आप नोड आईडी या शीर्षक के माध्यम से वास्तव में आसानी से फाइलें पा सकते हैं, और फिर उप-फ़ोल्डर नाम टकराव को रोकता है ताकि आप एक ही नाम के साथ एक ही फ़ाइल के कई संस्करण रख सकें। फिर बाद में आप पुराने संशोधनों को हटा सकते हैं यदि आप अंतरिक्ष को साफ करना चाहते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.