Automatisches Löschen von Uploads aus alten gelöschten Beiträgen

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.

8 „Gefällt mir“

Ich hätte das auch sehr gerne.

Es scheint, als wäre diese Funktion teilweise implementiert:

Einstellungen, die ich verwende:
clean orphan uploads grace period hours: 1
purge deleted uploads grace period days: 1

Ein gelöschter Upload beinhaltet nicht den Fall, dass ein Beitrag gelöscht wird, in dem das Bild enthalten ist. Das Bild/der Upload muss zuerst aus dem Beitrag bearbeitet werden, bevor er gelöscht wird, glaube ich.

Ich kann bestätigen, dass Bilder nicht gelöscht werden, wenn der (einzige) Beitrag, der dieses spezielle Bild enthält, gelöscht wurde, da ich Bilder habe, die 2023 aus einem gelöschten Beitrag noch in der Datenbank und S3 vorhanden sind (das Bild wird in keinen anderen Beiträgen verwendet). Ich hatte auch in früheren Fällen nie eine Löschung.

Wenn also ein Moderator einen Beitrag wegen eines hochgeladenen Bildes löscht, das gegen die Regeln verstößt, muss er es, um es wirklich zu löschen, zuerst aus dem Thema/Beitrag herausbearbeiten (und hoffen, dass es in keinem anderen Beitrag vorkommt). Andernfalls wird es auf S3 unbegrenzt vorhanden sein, zumindest nach meinem Verständnis.

Einige Funktionen, die wirklich großartig wären:

  • purge deleted uploads grace period days - Entweder diese Einstellung sollte den Fall einschließen, dass ein Bild in einem gelöschten Beitrag enthalten ist, oder eine weitere Einstellung für diesen Fall hinzufügen.

  • purge deleted uploads grace period days - Stunden statt Tage verwenden. Urheberrechtsentfernungsanfragen erfordern im Allgemeinen äußerst zeitnahe Maßnahmen, innerhalb von 24-48 Stunden. 1 Tag ist für diesen Fall viel zu langsam. Jeder CDN-Cache muss wahrscheinlich auch manuell geleert werden, nachdem er gelöscht wurde, was die Zeitspanne noch enger macht.

  • Ein Bild aus dem Dashboard löschen/bereinigen können. Wenn “purge deleted uploads” jedoch auch Bilder in gelöschten Beiträgen einschließen würde, wäre dies weniger notwendig, aber es gibt immer noch Fälle wie die Verwendung des Bildes als Avatar oder Profilbanner usw. sowie die Effizienz für Moderatoren. Feature suggestion: Image removal/purge via web dashboard

  • Bild-URLs durchsuchbar machen, dies würde den Fall abdecken, dass ein Moderator alle Themen/Beiträge finden kann, die ein bestimmtes Bild enthalten, um diese Beiträge ebenfalls zu löschen. Ohne SSH verwenden zu müssen.

  • Die Möglichkeit, bestimmte Hashes von Uploads zu sperren, wäre eine nette Ergänzung.

Es wäre schön, weil dann Prozesse wie diese von jemandem ohne SSH-Zugang und technischen Fähigkeiten gehandhabt werden könnten. Insbesondere wegen der Geschwindigkeit, mit der diese gehandhabt werden müssen. Es ist prohibitiv teuer, technisches Personal rund um die Uhr bereithalten zu müssen, um jeden Fall dieser Art zu bearbeiten, einschließlich an jedem Feiertag, Wochenende, wenn jemand krank ist usw. Man kann nicht vorhersagen, wann er auftreten wird, daher muss man jederzeit bereit sein, ihn umgehend zu bearbeiten. Es ist ein unvermeidliches Merkmal von UGC.

1 „Gefällt mir“

Ich frage mich, warum das nicht weiter diskutiert wird? Das ist wirklich ein großes Problem.

Ich habe ein PHP-Skript geschrieben, das eine CSV-Datei verwendet, die aus der folgenden SQL-Abfrage generiert wird und alle Uploads und ihre Referenzen auflistet:
(Erhöhen Sie das Limit, wenn Sie viele Uploads haben)

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

Was das Skript nun tut, ist, dass es Uploads filtert, die nur als Entwürfe verbleiben (was fälschlicherweise in der Datenbank verbleibt, wie ich hier erklärt habe). Das Skript gibt einen durch Leerzeichen getrennten String mit allen Dateinamen aus. Sie können das Skript auch ändern, um den vollständigen Pfad auszugeben (entfernen Sie die Funktion basename()).

Melden Sie sich dann bei Ihrem Discourse SSH-Server an und führen Sie den rm-Befehl für alle Dateien aus.

  • Ein Nachteil ist, dass alle Bilder, die in aktiven Entwürfen verbleiben, ebenfalls gelöscht werden (dies kann jedoch durch Senken von Entwürfe älter als n Tage löschen begrenzt werden).
  • Zweiter Nachteil - die fehlerhaften Datenbankeinträge bleiben bestehen, dafür müsste ich die Entwickler um eine Korrektur bitten.

Wenn die fehlerhaften Einträge gelöscht werden, sollte das Problem ordnungsgemäß behoben sein.

<?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)." ";
    }
?>

Die Datei test.csv, die die Abfrage enthält, sollte im selben Verzeichnis wie das Skript platziert werden.
Wenn Sie Probleme haben, fragen Sie mich!

3 „Gefällt mir“

Meine Vermutung ist, dass sich vielleicht viele nicht bewusst sind, dass Uploads nicht automatisch gelöscht werden.

Hier ist ein weiterer relevanter Thread für alle, die mehr lesen möchten:

2 „Gefällt mir“

Ich hatte gehofft, dass dies nach so langer Zeit bereits behoben wäre. Muss vielleicht noch einmal überprüfen, ob sich noch verwaiste Einträge auf dem Server befinden. Jedenfalls ist dieses Skript eine Lebensrettung.

2 „Gefällt mir“