connect_error) { die("Connection failed: " . $mysqli->connect_error); } $mysqli->set_charset("utf8"); // Получаем информацию о файле $result = $mysqli->query("SELECT notesid, filename, filesize, filetype, filelocationtype FROM vtiger_notes WHERE notesid = $notesid"); if (!$result || $result->num_rows == 0) { die("File not found in database\n"); } $row = $result->fetch_assoc(); $filename = $row['filename']; echo "Миграция файла ID: $notesid, File: $filename\n"; echo "==========================================\n"; // Поиск локального файла $storageDir = '/var/www/fastuser/data/www/crm.clientright.ru/storage/'; $localFilePath = null; // Список возможных путей для поиска $searchPaths = [ $storageDir . $filename, $storageDir . $notesid . '_' . $filename, ]; // Добавляем поиск по близким ID (±5 от текущего) for ($idOffset = -5; $idOffset <= 5; $idOffset++) { $searchId = $notesid + $idOffset; $searchPaths[] = $storageDir . $searchId . '_' . $filename; } // Добавляем поиск по годам (2023, 2024, 2025) for ($year = 2023; $year <= 2025; $year++) { $searchPaths[] = $storageDir . $year . '/' . $filename; $searchPaths[] = $storageDir . $year . '/' . $notesid . '_' . $filename; // Поиск по месяцам $months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; foreach ($months as $month) { $searchPaths[] = $storageDir . $year . '/' . $month . '/' . $filename; $searchPaths[] = $storageDir . $year . '/' . $month . '/' . $notesid . '_' . $filename; // Поиск по неделям for ($week = 1; $week <= 5; $week++) { $searchPaths[] = $storageDir . $year . '/' . $month . '/week' . $week . '/' . $filename; $searchPaths[] = $storageDir . $year . '/' . $month . '/week' . $week . '/' . $notesid . '_' . $filename; // Поиск по близким ID в структурированном хранилище for ($idOffset = -5; $idOffset <= 5; $idOffset++) { $searchId = $notesid + $idOffset; $searchPaths[] = $storageDir . $year . '/' . $month . '/week' . $week . '/' . $searchId . '_' . $filename; } } } } // Ищем первый существующий файл foreach ($searchPaths as $path) { if (file_exists($path) && is_readable($path)) { $localFilePath = $path; break; } } if ($localFilePath === null) { die("❌ Physical file not found anywhere.\n"); } echo "✅ Найден файл: $localFilePath\n"; echo " Размер: " . filesize($localFilePath) . " bytes\n"; // Подключение S3 сервиса require_once '/var/www/fastuser/data/www/crm.clientright.ru/include/Storage/S3StorageService.php'; $s3Service = new S3StorageService(); $s3Bucket = 'f9825c87-4e3558f6-f9b6-405c-ad3d-d1535c49b61c'; // Формирование S3 ключа $s3_key = 'crm2/CRM_Active_Files/Documents/' . $notesid . '/' . $filename; echo "📤 Загружаем в S3...\n"; echo " S3 Key: $s3_key\n"; try { // Загрузка в S3 $s3_result = $s3Service->put($localFilePath, $notesid, $filename); if ($s3_result && isset($s3_result['url'])) { $s3_etag = isset($s3_result['etag']) ? trim($s3_result['etag'], '"') : ''; $s3_url = $s3_result['url']; $s3_key = $s3_result['key']; echo "✅ S3 загрузка успешна!\n"; echo " URL: $s3_url\n"; echo " ETag: $s3_etag\n"; // Обновление базы данных $update_query = "UPDATE vtiger_notes SET s3_key = ?, s3_bucket = ?, s3_etag = ?, filename = ?, filelocationtype = 'E' WHERE notesid = ?"; $update_stmt = $mysqli->prepare($update_query); if (!$update_stmt) { die("❌ Update prepare failed: " . $mysqli->error . "\n"); } $update_stmt->bind_param('ssssi', $s3_key, $s3Bucket, $s3_etag, $s3_url, $notesid); if ($update_stmt->execute()) { echo "✅ База данных обновлена!\n"; // Удаление локального файла if (unlink($localFilePath)) { echo "🗑️ Локальный файл удален: $localFilePath\n"; } else { echo "⚠️ Не удалось удалить локальный файл: $localFilePath\n"; } } else { echo "❌ Ошибка обновления БД: " . $update_stmt->error . "\n"; } $update_stmt->close(); } else { echo "❌ S3 загрузка не удалась. Результат: " . json_encode($s3_result) . "\n"; } } catch (Exception $e) { echo "❌ Ошибка S3: " . $e->getMessage() . "\n"; } $mysqli->close(); echo "\n🎉 Миграция завершена!\n"; ?>