217 lines
8.3 KiB
PHP
217 lines
8.3 KiB
PHP
|
|
<?php
|
|||
|
|
error_reporting(E_ALL);
|
|||
|
|
ini_set('display_errors', 1);
|
|||
|
|
|
|||
|
|
require_once '/var/www/fastuser/data/www/crm.clientright.ru/vendor/autoload.php';
|
|||
|
|
$config = require '/var/www/fastuser/data/www/crm.clientright.ru/crm_extensions/file_storage/config.php';
|
|||
|
|
|
|||
|
|
$s3Bucket = $config['s3']['bucket'];
|
|||
|
|
$projectId = 371231;
|
|||
|
|
$docId = 371983;
|
|||
|
|
|
|||
|
|
echo "Поиск файла в S3\n";
|
|||
|
|
echo "Bucket: $s3Bucket\n";
|
|||
|
|
echo "Project ID: $projectId\n";
|
|||
|
|
echo "Document ID: $docId\n\n";
|
|||
|
|
|
|||
|
|
try {
|
|||
|
|
$s3Client = new \Aws\S3\S3Client([
|
|||
|
|
'version' => 'latest',
|
|||
|
|
'region' => $config['s3']['region'],
|
|||
|
|
'endpoint' => $config['s3']['endpoint'],
|
|||
|
|
'use_path_style_endpoint' => true,
|
|||
|
|
'credentials' => [
|
|||
|
|
'key' => $config['s3']['key'],
|
|||
|
|
'secret' => $config['s3']['secret'],
|
|||
|
|
],
|
|||
|
|
'suppress_php_deprecation_warning' => true
|
|||
|
|
]);
|
|||
|
|
|
|||
|
|
// Получаем s3_key из БД
|
|||
|
|
require_once '/var/www/fastuser/data/www/crm.clientright.ru/config.inc.php';
|
|||
|
|
$pdo = new PDO(
|
|||
|
|
"mysql:host={$dbconfig['db_server']};port=3306;dbname={$dbconfig['db_name']};charset=utf8",
|
|||
|
|
$dbconfig['db_username'],
|
|||
|
|
$dbconfig['db_password'],
|
|||
|
|
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
$stmt = $pdo->prepare('SELECT s3_key, filename FROM vtiger_notes WHERE notesid = ?');
|
|||
|
|
$stmt->execute([$docId]);
|
|||
|
|
$doc = $stmt->fetch(PDO::FETCH_ASSOC);
|
|||
|
|
|
|||
|
|
if (!$doc) {
|
|||
|
|
die("Документ $docId не найден в БД\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
$s3Key = $doc['s3_key'];
|
|||
|
|
echo "S3 Key из БД: $s3Key\n\n";
|
|||
|
|
|
|||
|
|
// Варианты путей для проверки
|
|||
|
|
$variants = [
|
|||
|
|
$s3Key, // Оригинальный путь
|
|||
|
|
rawurlencode($s3Key), // URL-encoded
|
|||
|
|
str_replace(' ', '_', $s3Key), // Замена пробелов
|
|||
|
|
str_replace(' ', '%20', $s3Key), // Пробелы как %20
|
|||
|
|
];
|
|||
|
|
|
|||
|
|
echo "1. Проверка существования файла по разным вариантам пути:\n";
|
|||
|
|
foreach ($variants as $i => $variant) {
|
|||
|
|
echo " Вариант " . ($i + 1) . ": " . substr($variant, 0, 100) . "...\n";
|
|||
|
|
try {
|
|||
|
|
$result = $s3Client->headObject([
|
|||
|
|
'Bucket' => $s3Bucket,
|
|||
|
|
'Key' => $variant
|
|||
|
|
]);
|
|||
|
|
echo " ✅ Файл найден! Size: " . $result['ContentLength'] . " bytes\n";
|
|||
|
|
echo " ContentType: " . $result['ContentType'] . "\n";
|
|||
|
|
break;
|
|||
|
|
} catch (\Aws\Exception\AwsException $e) {
|
|||
|
|
if ($e->getAwsErrorCode() == 'NotFound') {
|
|||
|
|
echo " ❌ Не найден\n";
|
|||
|
|
} else {
|
|||
|
|
echo " ⚠️ Ошибка: " . $e->getAwsErrorCode() . "\n";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
echo "\n";
|
|||
|
|
|
|||
|
|
// Поиск всех файлов в папке проекта
|
|||
|
|
echo "2. Поиск всех файлов в папке проекта:\n";
|
|||
|
|
$prefixes = [
|
|||
|
|
"crm2/CRM_Active_Files/Documents/Project/",
|
|||
|
|
"crm2/CRM_Active_Files/Documents/",
|
|||
|
|
"Documents/Project/",
|
|||
|
|
"Documents/",
|
|||
|
|
];
|
|||
|
|
|
|||
|
|
$allFoundFiles = [];
|
|||
|
|
foreach ($prefixes as $projectPrefix) {
|
|||
|
|
echo " Проверка префикса: $projectPrefix\n";
|
|||
|
|
try {
|
|||
|
|
$objects = $s3Client->listObjectsV2([
|
|||
|
|
'Bucket' => $s3Bucket,
|
|||
|
|
'Prefix' => $projectPrefix,
|
|||
|
|
'MaxKeys' => 1000
|
|||
|
|
]);
|
|||
|
|
|
|||
|
|
if (isset($objects['Contents'])) {
|
|||
|
|
foreach ($objects['Contents'] as $object) {
|
|||
|
|
$key = $object['Key'];
|
|||
|
|
// Ищем файлы, связанные с проектом 371231 или документом 371983
|
|||
|
|
if (strpos($key, (string)$projectId) !== false || strpos($key, '371983') !== false ||
|
|||
|
|
strpos($key, 'Ломакин') !== false || strpos($key, 'НЕТОЛОГИЯ') !== false) {
|
|||
|
|
if (!in_array($key, $allFoundFiles)) {
|
|||
|
|
$allFoundFiles[] = $key;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
} catch (\Aws\Exception\AwsException $e) {
|
|||
|
|
echo " Ошибка при поиске: " . $e->getMessage() . "\n";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (!empty($allFoundFiles)) {
|
|||
|
|
echo " Найдено " . count($allFoundFiles) . " файлов:\n";
|
|||
|
|
foreach ($allFoundFiles as $file) {
|
|||
|
|
echo " - $file\n";
|
|||
|
|
}
|
|||
|
|
} else {
|
|||
|
|
echo " Файлы проекта не найдены в S3\n";
|
|||
|
|
}
|
|||
|
|
echo "\n";
|
|||
|
|
|
|||
|
|
// Поиск файла по имени (без полного пути)
|
|||
|
|
echo "3. Поиск файла по имени и ID документа:\n";
|
|||
|
|
$searchPatterns = [
|
|||
|
|
"11.1_Доказательство_соблюдения_претензионного_поря_371983.pdf",
|
|||
|
|
"371983",
|
|||
|
|
"11.1",
|
|||
|
|
"Доказательство_соблюдения"
|
|||
|
|
];
|
|||
|
|
|
|||
|
|
$foundFiles = [];
|
|||
|
|
foreach ($searchPatterns as $pattern) {
|
|||
|
|
echo " Поиск по паттерну: $pattern\n";
|
|||
|
|
try {
|
|||
|
|
// Ищем в разных префиксах
|
|||
|
|
$searchPrefixes = [
|
|||
|
|
"crm2/CRM_Active_Files/",
|
|||
|
|
"Documents/",
|
|||
|
|
""
|
|||
|
|
];
|
|||
|
|
|
|||
|
|
foreach ($searchPrefixes as $prefix) {
|
|||
|
|
$objects = $s3Client->listObjectsV2([
|
|||
|
|
'Bucket' => $s3Bucket,
|
|||
|
|
'Prefix' => $prefix,
|
|||
|
|
'MaxKeys' => 5000
|
|||
|
|
]);
|
|||
|
|
|
|||
|
|
if (isset($objects['Contents'])) {
|
|||
|
|
foreach ($objects['Contents'] as $object) {
|
|||
|
|
$key = $object['Key'];
|
|||
|
|
if (stripos($key, $pattern) !== false) {
|
|||
|
|
if (!in_array($key, $foundFiles)) {
|
|||
|
|
$foundFiles[] = $key;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
} catch (\Aws\Exception\AwsException $e) {
|
|||
|
|
echo " Ошибка при поиске: " . $e->getMessage() . "\n";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (!empty($foundFiles)) {
|
|||
|
|
echo " Найдено " . count($foundFiles) . " файлов:\n";
|
|||
|
|
foreach ($foundFiles as $file) {
|
|||
|
|
echo " - $file\n";
|
|||
|
|
// Проверяем доступность
|
|||
|
|
try {
|
|||
|
|
$result = $s3Client->headObject([
|
|||
|
|
'Bucket' => $s3Bucket,
|
|||
|
|
'Key' => $file
|
|||
|
|
]);
|
|||
|
|
echo " ✅ Доступен, размер: " . $result['ContentLength'] . " bytes\n";
|
|||
|
|
} catch (\Aws\Exception\AwsException $e) {
|
|||
|
|
echo " ❌ Недоступен: " . $e->getAwsErrorCode() . "\n";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
} else {
|
|||
|
|
echo " Файл не найден по имени\n";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Проверяем все документы проекта из БД
|
|||
|
|
echo "\n4. Проверка всех документов проекта из БД:\n";
|
|||
|
|
$stmt = $pdo->prepare('SELECT n.notesid, n.title, n.s3_key FROM vtiger_notes n INNER JOIN vtiger_crmentity e ON e.crmid = n.notesid INNER JOIN vtiger_senotesrel snr ON snr.notesid = n.notesid WHERE snr.crmid = ? AND e.deleted = 0 AND n.filelocationtype = "E" ORDER BY n.notesid DESC LIMIT 10');
|
|||
|
|
$stmt->execute([$projectId]);
|
|||
|
|
$docs = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|||
|
|
|
|||
|
|
echo " Проверка " . count($docs) . " документов:\n";
|
|||
|
|
$foundCount = 0;
|
|||
|
|
foreach ($docs as $doc) {
|
|||
|
|
$key = $doc['s3_key'];
|
|||
|
|
try {
|
|||
|
|
$result = $s3Client->headObject([
|
|||
|
|
'Bucket' => $s3Bucket,
|
|||
|
|
'Key' => $key
|
|||
|
|
]);
|
|||
|
|
echo " ✅ ID {$doc['notesid']}: " . substr($doc['title'], 0, 50) . "...\n";
|
|||
|
|
$foundCount++;
|
|||
|
|
} catch (\Aws\Exception\AwsException $e) {
|
|||
|
|
if ($e->getAwsErrorCode() == 'NotFound') {
|
|||
|
|
echo " ❌ ID {$doc['notesid']}: " . substr($doc['title'], 0, 50) . "... (не найден)\n";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
echo " Найдено в S3: $foundCount из " . count($docs) . "\n";
|
|||
|
|
|
|||
|
|
} catch (Exception $e) {
|
|||
|
|
echo "ОШИБКА: " . $e->getMessage() . "\n";
|
|||
|
|
echo "Trace: " . $e->getTraceAsString() . "\n";
|
|||
|
|
}
|
|||
|
|
|