Discourse already automatically removes orphan unreferenced uploads. Why not expand this functionality and erase uploads from deleted posts? Only staff members are able to see deleted posts and that is very useful. But is it really necessary to keep all the files indefinitely? As administrator I really don`t care about 2 years old deleted pictures. Some of which may even be right out against site guidelines.
It would be nice if Discourse would automatically delete these kind old files and place some kind of text block in the place of deleted file. So that it would be evident that file deletion has taken place.
For example all year old uploads which are referenced only in deleted posts would be automatically deleted.
الإعدادات التي أستخدمها:
clean orphan uploads grace period hours: 1
purge deleted uploads grace period days: 1
ومع ذلك، فإن التحميل المحذوف لا يشمل حالة حذف منشور مع الصورة الموجودة بداخله. أعتقد أن الصورة/التحميل يجب إزالته من المنشور أولاً قبل الحذف.
يمكنني التأكيد على أن الصور لن تُحذف إذا تم حذف المنشور (الوحيد) الذي يحتوي على هذه الصورة المحددة، حيث لدي صور لا تزال موجودة في قاعدة البيانات و S3 من منشور تم حذفه في عام 2023 (دون استخدام الصورة في أي منشورات أخرى). لم يحدث لي أن حذفتها في حالات سابقة أيضًا.
لذلك، إذا قام مشرف بحذف منشور بسبب احتوائه على صورة تم تحميلها وتخالف القواعد، لحذفها حقًا، يجب عليه إزالتها من الموضوع/المنشور أولاً (والأمل ألا تكون موجودة في أي منشورات أخرى). وإلا فإنها ستظل موجودة على S3 إلى أجل غير مسمى، على الأقل حسب فهمي.
بعض الميزات التي ستكون رائعة حقًا:
purge deleted uploads grace period days - إما أن تتضمن هذه الإعدادات حالة وجود صورة داخل منشور محذوف، أو إضافة إعداد آخر لهذه الحالة.
purge deleted uploads grace period days - استخدام الساعات بدلاً من الأيام. تتطلب طلبات إزالة حقوق النشر عمومًا إجراءً سريعًا للغاية، في غضون 24-48 ساعة. يوم واحد بطيء جدًا لهذه الحالة. من المحتمل أيضًا أن تحتاج ذاكرة التخزين المؤقت لشبكة توصيل المحتوى (CDN) إلى مسح يدوي بعد حذفها، مما يجعل الجدول الزمني أضيق.
القدرة على حذف/مسح صورة من لوحة التحكم. ومع ذلك، إذا كانت عملية purge deleted uploads تشمل الصور داخل المنشورات المحذوفة، فسيكون هذا أقل ضرورة، ولكن لا تزال هناك حالات مثل استخدام الصورة كصورة رمزية، أو كصورة خلفية للملف الشخصي وما إلى ذلك، بالإضافة إلى كونها أكثر كفاءة للمشرفين. Feature suggestion: Image removal/purge via web dashboard
جعل عناوين URL للصور قابلة للبحث، وهذا سيغطي حالة قدرة المشرف على العثور على جميع المواضيع/المنشورات التي تحتوي على صورة معينة لحذف تلك المنشورات أيضًا. دون الحاجة إلى استخدام SSH.
القدرة على حظر تجزئات معينة من التحميل ستكون لمسة لطيفة.
سيكون ذلك لطيفًا لأنه سيمكن الأشخاص الذين لا يمتلكون وصول SSH ومهارات تقنية من التعامل مع عمليات مثل هذه. خاصة بسبب السرعة التي يجب التعامل بها معها. إنها مكلفة للغاية وتتطلب وجود موظفين تقنيين جاهزين على مدار الساعة طوال أيام الأسبوع للتعامل مع أي حالة من هذا القبيل تنشأ، بما في ذلك في كل عطلة، وعطلات نهاية الأسبوع، وعندما يكون شخص ما مريضًا، وما إلى ذلك. لا يمكنك التنبؤ بموعد حدوثها، وبالتالي يجب أن تكون مستعدًا دائمًا للتعامل معها بسرعة في أي وقت. إنها سمة لا مفر منها للمحتوى الذي ينشئه المستخدمون (UGC).
أتساءل لماذا لا يتم مناقشة هذا على نطاق أوسع؟ هذه مشكلة كبيرة حقًا.
لقد كتبت برنامج PHP، والذي يستخدم ملف CSV تم إنشاؤه من استعلام SQL التالي الذي يسرد جميع التحميلات ومراجعها:
(قم بزيادة الحد إذا كان لديك الكثير من التحميلات)
SELECT
uploads.original_filename,
ROUND(uploads.filesize / 1000000.0, 2) AS size_in_mb,
uploads.extension,
uploads.created_at,
uploads.url,
upload_references.upload_id,
upload_references.target_id,
upload_references.target_type,
upload_references.created_at,
upload_references.updated_at
FROM upload_references
JOIN uploads ON uploads.id = upload_references.upload_id
ORDER BY upload_references.target_type
LIMIT 90000
الآن ما يفعله البرنامج هو أنه يقوم بتصفية التحميلات التي تظل كمسودات فقط (والتي تبقى بشكل خاطئ في قاعدة البيانات كما شرحت هنا). يقوم البرنامج بإخراج سلسلة مفصولة بمسافات مع جميع أسماء الملفات. يمكنك أيضًا تعديل البرنامج لإخراج المسار الكامل (إزالة الدالة basename()).
ثم قم بتسجيل الدخول إلى خادم SSH الخاص بك في Discourse وقم بتنفيذ أمر rm لجميع الملفات.
أحد عيوب هذا هو أنه سيتم حذف جميع الصور التي تظل في المسودات النشطة أيضًا (ولكن يمكن الحد من ذلك عن طريق خفض حذف المسودات التي يزيد عمرها عن n يومًا).
العيب الثاني - لا تزال إدخالات قاعدة البيانات غير الصحيحة موجودة، ولهذا يجب أن أطلب من المطورين إصلاحًا.
إذا تم حذف الإدخالات غير الصحيحة، فيجب إصلاح المشكلة بشكل صحيح.
<?php
if (($open = fopen("test.csv", "r")) !== false) {
while (($data = fgetcsv($open, 100000, ",")) !== false) {
$array[] = $data;
}
fclose($open);
}
$final = array();
$i=0;
foreach ($array as $item){
if($item[7]=="Draft"){
foreach ($array as $item_inside){
if(($item_inside[4]==$item[4]) && ($item_inside[7]!="Draft")) $i++; //taisa i++, kad nav tikai drafts
}
if($i==0)array_push($final, $item[4]); //bija tikai drafti, var likt masiivaa
$i=0;
}
}
$final_unique= array_unique($final);
//print_r($final_unique);
foreach($final_unique as $single){
echo basename($single)." ";
}
?>
يجب وضع الملف test.csv الذي يحتوي على الاستعلام في نفس الدليل الذي يوجد به البرنامج.
إذا كانت لديك أي مشاكل، اسألني!