getModule(); $moduleModel = Vtiger_Module_Model::getInstance($moduleName); $userPrivilegesModel = Users_Privileges_Model::getCurrentUserPrivilegesModel(); $permission = $userPrivilegesModel->hasModulePermission($moduleModel->getId()); if(!$permission) { throw new AppException(vtranslate($moduleName).' '.vtranslate('LBL_NOT_ACCESSIBLE')); } $recordId = $request->get('record'); if($recordId) { $recordEntityName = getSalesEntityType($recordId); if($recordEntityName !== $moduleName) { throw new AppException(vtranslate('LBL_PERMISSION_DENIED')); } } } public function process(\Vtiger_Request $request) { global $log; $recordId = $request->get('record'); $moduleName = $request->getModule(); $log->debug("DownloadS3: Processing download for record $recordId"); try { // Получаем информацию о документе $recordModel = Vtiger_Record_Model::getInstanceById($recordId, $moduleName); if (!$recordModel) { throw new Exception("Document not found: $recordId"); } // Проверяем, есть ли S3 метаданные $db = PearDatabase::getInstance(); $result = $db->pquery( "SELECT s3_bucket, s3_key, filename FROM vtiger_notes WHERE notesid = ? AND s3_key IS NOT NULL", array($recordId) ); if ($db->num_rows($result) > 0) { // Файл в S3 - используем presigned URL $row = $db->query_result_rowdata($result, 0); $s3Bucket = $row['s3_bucket']; $s3Key = $row['s3_key']; $filename = $row['filename']; $log->debug("DownloadS3: Found S3 file - bucket: $s3Bucket, key: $s3Key"); // Загружаем S3 Storage Service require_once __DIR__ . '/../../../include/Storage/S3StorageService.php'; $s3Service = new S3StorageService(); // Генерируем presigned URL $presignedUrl = $s3Service->presignGet($s3Key, '+10 minutes'); $log->debug("DownloadS3: Generated presigned URL for record $recordId"); // Перенаправляем на presigned URL header('Location: ' . $presignedUrl, true, 302); exit; } else { // Файл в локальном storage - используем старый метод $log->debug("DownloadS3: No S3 metadata found, falling back to local storage for record $recordId"); // Проверяем, есть ли файл в локальном storage $fileDetails = $recordModel->getFileDetails(); if (!empty($fileDetails) && $recordModel->get('filelocationtype') == 'I') { // Используем старый метод скачивания $recordModel->downloadFile(); } else { throw new Exception("File not found in S3 or local storage for record: $recordId"); } } } catch (Exception $e) { $log->error("DownloadS3: Error downloading file for record $recordId: " . $e->getMessage()); // Показываем пользователю ошибку header('Content-Type: text/html; charset=utf-8'); echo 'Ошибка скачивания'; echo '

Ошибка скачивания файла

'; echo '

Не удалось скачать файл. Попробуйте позже.

'; echo '

Вернуться назад

'; echo ''; exit; } } } ?>