Auto purge uploads from old deleted posts

Por que isso não é mais discutido? Este é realmente um grande problema.

Escrevi um script PHP, que usa um arquivo CSV gerado a partir de a seguinte consulta SQL que lista todos os uploads e suas referências:
(aumente o limite se você tiver muitos uploads)

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

Agora, o que o script faz é filtrar os uploads que permanecem apenas como rascunhos (que permanecem falsamente no banco de dados, como expliquei aqui). O script gera uma string separada por espaços com todos os nomes de arquivos. Você também pode modificar o script para gerar o caminho completo (remova a função basename()).

Em seguida, faça login no seu servidor SSH do Discourse e execute o comando rm para todos os arquivos.

  • Uma desvantagem disso é que todas as imagens que permanecem em rascunhos ativos também serão excluídas (mas isso pode ser limitado diminuindo excluir rascunhos com mais de n dias).
  • Segunda desvantagem - as entradas incorretas no banco de dados ainda permanecem, para isso eu deveria pedir uma correção aos desenvolvedores.

Se as entradas incorretas forem excluídas, o problema deverá ser corrigido adequadamente.

<?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
		}
	}
$final_unique= array_unique($final);
//print_r($final_unique);

foreach($final_unique as $single){
	echo basename($single)." ";
	}
?>

O arquivo test.csv contendo a consulta deve ser colocado no mesmo diretório do script.
Se tiver algum problema, me pergunte!

3 curtidas