Mi chiedo perché non se ne parli più ampiamente? Questo è davvero un grosso problema.
Ho scritto uno script PHP, che utilizza un file CSV generato dalla seguente query SQL che elenca tutti i caricamenti e i loro riferimenti:
(aumenta il limite se hai molti caricamenti)
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
Ora, ciò che fa lo script è filtrare i caricamenti che rimangono solo come bozze (che rimangono erroneamente nel database come ho spiegato qui). Lo script produce una stringa separata da spazi con tutti i nomi dei file. Puoi anche modificare lo script per produrre il percorso completo (rimuovere la funzione basename()).
Quindi accedi al tuo server SSH di discourse ed esegui il comando rm per tutti i file.
- Uno svantaggio di questo è che verranno eliminate anche tutte le immagini che rimangono nelle bozze attive (ma questo può essere limitato abbassando elimina bozze più vecchie di n giorni).
- Secondo svantaggio: le voci errate nel database rimangono ancora, per questo dovrei chiedere una correzione agli sviluppatori.
Se le voci errate vengono eliminate, il problema dovrebbe essere risolto correttamente.
<?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)." ";
}
?>
Il file test.csv contenente la query dovrebbe essere posizionato nella stessa directory dello script.
Se hai problemi, chiedi pure!