pquery($query, array($recordId)); $row = $adb->fetchByAssoc($result, -1, false); if (!$row) { echo "❌ Документ не найден в БД!\n"; exit(1); } echo "📄 ДОКУМЕНТ В БД:\n"; echo " ✅ Запись существует\n"; echo " - Title: " . ($row['title'] ?? 'N/A') . "\n"; echo " - Note No: " . ($row['note_no'] ?? 'N/A') . "\n"; echo " - Filename: " . ($row['filename'] ?? 'N/A') . "\n"; echo " - Filelocationtype: " . ($row['filelocationtype'] ?? 'N/A') . "\n"; echo " - Filesize: " . ($row['filesize'] ?? 'N/A') . " байт\n"; echo " - S3 Bucket: " . ($row['s3_bucket'] ?? 'N/A') . "\n"; echo " - S3 Key: " . ($row['s3_key'] ?? 'N/A') . "\n"; echo " - S3 ETag: " . ($row['s3_etag'] ?? 'N/A') . "\n"; echo " - Deleted: " . ($row['deleted'] ?? 'N/A') . "\n"; echo " - Filestatus: " . ($row['filestatus'] ?? 'N/A') . "\n\n"; // Проверяем S3 echo "📦 ПРОВЕРКА S3:\n"; if (!empty($row['s3_bucket']) && !empty($row['s3_key'])) { require_once 'crm_extensions/file_storage/config.php'; require_once 'vendor/autoload.php'; $config = require 'crm_extensions/file_storage/config.php'; $awsClient = new Aws\S3\S3Client([ 'version' => 'latest', 'region' => $config['s3']['region'], 'endpoint' => $config['s3']['endpoint'], 'use_path_style_endpoint' => $config['s3']['use_path_style_endpoint'], 'credentials' => [ 'key' => $config['s3']['key'], 'secret' => $config['s3']['secret'], ], ]); try { $result = $awsClient->headObject([ 'Bucket' => $row['s3_bucket'], 'Key' => $row['s3_key'] ]); echo " ✅ Файл существует в S3\n"; echo " - Size: " . ($result['ContentLength'] ?? 'N/A') . " байт\n"; } catch (Aws\S3\Exception\S3Exception $e) { if ($e->getAwsErrorCode() == 'NoSuchKey' || $e->getAwsErrorCode() == 'NotFound') { echo " ❌ Файл НЕ существует в S3 (404 Not Found)\n"; } else if ($e->getAwsErrorCode() == '403' || $e->getStatusCode() == 403) { echo " ⚠️ Доступ запрещен (403 Forbidden)\n"; } else { echo " ❌ Ошибка: " . $e->getAwsErrorCode() . "\n"; } } } else { echo " ⚠️ S3 метаданные отсутствуют\n"; } // Проверяем локальное хранилище echo "\n💾 ПРОВЕРКА ЛОКАЛЬНОГО ХРАНИЛИЩА:\n"; $query2 = "SELECT a.* FROM vtiger_attachments a INNER JOIN vtiger_seattachmentsrel sar ON sar.attachmentsid = a.attachmentsid WHERE sar.crmid = ?"; $result2 = $adb->pquery($query2, array($recordId)); if ($adb->num_rows($result2) > 0) { $row2 = $adb->fetchByAssoc($result2, -1, false); $filePath = $row2['path'] . $row2['attachmentsid'] . '_' . $row2['storedname']; if (file_exists($filePath)) { echo " ✅ Файл существует локально\n"; echo " - Path: $filePath\n"; echo " - Size: " . filesize($filePath) . " байт\n"; } else { echo " ❌ Файл НЕ существует локально\n"; echo " - Ожидаемый путь: $filePath\n"; } } else { echo " ⚠️ Запись о вложении отсутствует\n"; } // Итоговый вывод echo "\n📊 ИТОГ:\n"; $hasS3 = !empty($row['s3_bucket']) && !empty($row['s3_key']); $hasLocal = $adb->num_rows($result2) > 0; if (!$hasS3 && !$hasLocal) { echo " ❌ КРИТИЧЕСКАЯ ПРОБЛЕМА: Файл отсутствует везде!\n"; echo " Документ существует в БД, но файл недоступен ни в S3, ни локально.\n\n"; echo " 💡 ВОЗМОЖНЫЕ РЕШЕНИЯ:\n"; echo " 1. Восстановить файл из бэкапа S3 (если есть)\n"; echo " 2. Удалить запись документа из БД\n"; echo " 3. Обновить запись, указав filelocationtype = NULL\n"; echo " 4. Если файл был перемещен, обновить s3_bucket и s3_key\n"; } else if ($hasS3) { echo " ⚠️ Файл должен быть в S3, но недоступен\n"; } else if ($hasLocal) { echo " ⚠️ Файл должен быть локально, но недоступен\n"; } echo "\n=== Сводка завершена ===\n";