(string $folder, array $files)
| 1457 | } |
| 1458 | |
| 1459 | public static function deleteFilesPermanent(string $folder, array $files): array |
| 1460 | { |
| 1461 | $errors = []; |
| 1462 | $deleted = []; |
| 1463 | $storage = self::storage(); |
| 1464 | |
| 1465 | list($uploadDir, $err) = self::resolveFolderPath($folder, false); |
| 1466 | if ($err) { |
| 1467 | return ['error' => $err]; |
| 1468 | } |
| 1469 | |
| 1470 | $uploadDir = rtrim($uploadDir, '/\\') . DIRECTORY_SEPARATOR; |
| 1471 | $safeFileNamePattern = REGEX_FILE_NAME; |
| 1472 | |
| 1473 | foreach ($files as $fileName) { |
| 1474 | $originalName = basename(trim((string)$fileName)); |
| 1475 | $basename = $originalName; |
| 1476 | |
| 1477 | if ($basename === '') { |
| 1478 | $errors[] = 'Empty file name.'; |
| 1479 | continue; |
| 1480 | } |
| 1481 | |
| 1482 | if (!preg_match($safeFileNamePattern, $basename)) { |
| 1483 | $errors[] = "$basename has an invalid name."; |
| 1484 | continue; |
| 1485 | } |
| 1486 | |
| 1487 | $filePath = $uploadDir . $basename; |
| 1488 | |
| 1489 | if ($storage->stat($filePath) !== null) { |
| 1490 | if (!$storage->delete($filePath)) { |
| 1491 | $errors[] = "Failed to delete {$basename}."; |
| 1492 | continue; |
| 1493 | } |
| 1494 | } |
| 1495 | |
| 1496 | $deleted[] = $basename; |
| 1497 | |
| 1498 | // Remove from folder metadata if present |
| 1499 | $metadataFile = self::getMetadataFilePath($folder); |
| 1500 | if (file_exists($metadataFile)) { |
| 1501 | $meta = json_decode(file_get_contents($metadataFile), true); |
| 1502 | if (is_array($meta) && isset($meta[$basename])) { |
| 1503 | unset($meta[$basename]); |
| 1504 | @file_put_contents($metadataFile, json_encode($meta, JSON_PRETTY_PRINT), LOCK_EX); |
| 1505 | } |
| 1506 | } |
| 1507 | } |
| 1508 | |
| 1509 | if ($errors && !$deleted) { |
| 1510 | return ['error' => implode('; ', $errors)]; |
| 1511 | } |
| 1512 | |
| 1513 | if ($errors) { |
| 1514 | return [ |
| 1515 | 'error' => implode('; ', $errors), |
| 1516 | 'success' => 'Deleted: ' . implode(', ', $deleted), |
no test coverage detected