14 private static $_services =
24 if (!isset(self::$_services))
28 self::$_services = [];
29 foreach (
GetModuleEvents(
'clouds',
'OnGetStorageService',
true) as $arEvent)
32 if (is_object($obService))
34 self::$_services[$obService->GetID()] = $obService;
47 if (array_key_exists(
$ID, self::$_services))
49 return self::$_services[
$ID];
63 return self::$_services;
73 if (is_object($obService))
75 return $obService->GetLocationList();
91 if (is_object($obService))
93 return $obService->GetName();
108 if (array_key_exists(
'size', $arFile) && $arFile[
'size'] > 0)
110 $file_size = intval($arFile[
'size']);
112 elseif (array_key_exists(
'FILE_SIZE', $arFile) && $arFile[
'FILE_SIZE'] > 0)
114 $file_size = intval($arFile[
'FILE_SIZE']);
118 $file_size = intval($arFile[
'file_size']);
121 self::$file_skip_reason =
'';
123 $writableCounter = 0;
126 if ($bucket[
'ACTIVE'] !==
'Y')
132 if ($bucket[
'READ_ONLY'] ===
'Y')
138 foreach ($bucket[
'FILE_RULES_COMPILED'] as $rule)
140 if ($rule[
'MODULE_MASK'] !=
'')
142 $bMatchModule = (preg_match($rule[
'MODULE_MASK'], $arFile[
'MODULE_ID']) > 0);
146 $bMatchModule =
true;
149 if ($rule[
'EXTENTION_MASK'] !=
'')
152 (preg_match($rule[
'EXTENTION_MASK'], $strFileName) > 0)
153 || (preg_match($rule[
'EXTENTION_MASK'], $arFile[
'ORIGINAL_NAME']) > 0);
157 $bMatchExtention =
true;
160 if ($rule[
'SIZE_ARRAY'])
163 foreach ($rule[
'SIZE_ARRAY'] as $size)
166 ($file_size >= $size[0])
167 && ($size[1] === 0.0 || $file_size <= $size[1])
181 self::$file_skip_reason =
'NO_FILE_MODULE_MATCH';
183 elseif (!$bMatchExtention)
185 self::$file_skip_reason =
'NO_FILE_EXTENTION_MATCH';
189 self::$file_skip_reason =
'NO_FILE_SIZE_MATCH';
192 if ($bMatchModule && $bMatchExtention && $bMatchSize)
201 self::$file_skip_reason =
'NO_ACTIVE_BUCKETS';
203 elseif (!$writableCounter)
205 self::$file_skip_reason =
'NO_WRITABLE_BUCKETS';
216 $image = new \Bitrix\Main\File\Image(
$path);
218 if ((
$info = $image->getInfo(
false)) !==
null)
221 0 =>
$info->getWidth(),
222 1 =>
$info->getHeight(),
223 2 =>
$info->getFormat(),
224 3 =>
$info->getAttributes(),
225 'mime' =>
$info->getMime(),
241 public static function OnBeforeResizeImage($arFile, $arResizeParams, &$callbackData, &$bNeedResize, &$sourceImageFile, &$cacheImageFileTmp)
243 $callbackData =
null;
245 if (intval($arFile[
'HANDLER_ID']) <= 0)
251 if (!$obSourceBucket->Init())
258 $callbackData[
'obSourceBucket'] = $obSourceBucket;
261 $callbackData[
'obTargetBucket'] = $obTargetBucket = $obSourceBucket;
264 if ($obSourceBucket->READ_ONLY ===
'Y')
267 if (!is_object($bucket))
273 $callbackData[
'obTargetBucket'] = $obTargetBucket = $bucket;
279 $arFile[
'SRC'] = $obSourceBucket->GetFileSRC($arFile,
false);
282 if (defined(
'BX_MOBILE') && constant(
'BX_MOBILE') ===
true)
288 $bImmediate = $arResizeParams[5];
291 $callbackData[
'bImmediate'] = $bImmediate;
292 $callbackData[
'cacheID'] = $arFile[
'ID'] .
'/' . md5(serialize($arResizeParams));
293 $callbackData[
'cacheOBJ'] =
new CPHPCache;
294 $callbackData[
'fileDIR'] =
'/' .
'resize_cache/' . $callbackData[
'cacheID'] .
'/' . $arFile[
'SUBDIR'];
295 $callbackData[
'fileNAME'] = $arFile[
'FILE_NAME'];
296 $callbackData[
'fileURL'] = $callbackData[
'fileDIR'] .
'/' . $callbackData[
'fileNAME'];
299 if ($callbackData[
'cacheOBJ']->StartDataCache(CACHED_clouds_file_resize, $callbackData[
'cacheID'],
'clouds'))
301 $cacheImageFile = $obTargetBucket->GetFileSRC($callbackData[
'fileURL'],
false);
302 $arDestinationSize = [];
306 if (is_array($delayInfo) && ($delayInfo[
'ERROR_CODE'] < 10))
308 $callbackData[
'cacheSTARTED'] =
true;
309 if ($arFile[
'FILE_SIZE'] > 1)
311 $callbackData[
'fileSize'] = $arFile[
'FILE_SIZE'];
313 $bNeedResize =
false;
317 elseif ($fs = $obTargetBucket->FileExists($callbackData[
'fileURL']))
320 if (COption::GetOptionString(
'clouds',
'delayed_resize') ===
'Y')
331 $callbackData[
'cacheSTARTED'] =
true;
334 $callbackData[
'fileSize'] = $fs;
336 $bNeedResize =
false;
341 $callbackData[
'tmpFile'] = CFile::GetTempName(
'', $arFile[
'FILE_NAME']);
342 $callbackData[
'tmpFile'] = preg_replace(
'#[\\\\/]+#',
'/', $callbackData[
'tmpFile']);
346 && COption::GetOptionString(
'clouds',
'delayed_resize') ===
'Y'
355 $callbackData[
'cacheSTARTED'] =
false;
356 $bNeedResize =
false;
357 $callbackData[
'cacheOBJ']->AbortDataCache();
358 $callbackData[
'cacheVARS'] = [
359 'cacheImageFile' => $cacheImageFile,
360 'width' => $arDestinationSize[
'width'],
361 'height' => $arDestinationSize[
'height'],
366 elseif ($obSourceBucket->DownloadToFile($arFile, $callbackData[
'tmpFile']))
368 $callbackData[
'cacheSTARTED'] =
true;
370 $sourceImageFile = $callbackData[
'tmpFile'];
371 $cacheImageFileTmp = CFile::GetTempName(
'', $arFile[
'FILE_NAME']);
376 $callbackData[
'cacheSTARTED'] =
false;
377 $bNeedResize =
false;
378 $callbackData[
'cacheOBJ']->AbortDataCache();
385 $callbackData[
'cacheSTARTED'] =
false;
386 $callbackData[
'cacheVARS'] = $callbackData[
'cacheOBJ']->GetVars();
387 $bNeedResize =
false;
394 public static function OnAfterResizeImage($arFile, $arResizeParams, &$callbackData, &$cacheImageFile, &$cacheImageFileTmp, &$arImageSize)
399 if (!is_array($callbackData))
404 if ($callbackData[
'cacheSTARTED'])
407 $obTargetBucket = $callbackData[
'obTargetBucket'];
409 $cacheOBJ = $callbackData[
'cacheOBJ'];
411 if (isset($callbackData[
'tmpFile']))
416 $cacheOBJ->AbortDataCache();
418 $tmpFile =
$io->GetPhysicalName($callbackData[
'tmpFile']);
420 @rmdir(mb_substr($tmpFile, 0, -mb_strlen(
bx_basename($tmpFile))));
422 unlink($cacheImageFileTmp);
423 @rmdir(mb_substr($cacheImageFileTmp, 0, -mb_strlen(
bx_basename($cacheImageFileTmp))));
425 $obSourceBucket =
new CCloudStorageBucket(intval($arFile[
'HANDLER_ID']));
426 if ($obSourceBucket->Init())
428 $cacheImageFile = $obSourceBucket->GetFileSRC($arFile,
false);
434 if (!preg_match(
'/^image\\//', $arFileToStore[
'type']))
436 $arFileToStore[
'type'] = $arFile[
'CONTENT_TYPE'];
439 if ($obTargetBucket->SaveFile($callbackData[
'fileURL'], $arFileToStore))
441 $cacheImageFile = $obTargetBucket->GetFileSRC($callbackData[
'fileURL'],
false);
443 $arImageSize = static::GetImageSize($cacheImageFileTmp);
444 $arImageSize[2] = filesize(
$io->GetPhysicalName($cacheImageFileTmp));
445 $iFileSize = filesize($arFileToStore[
'tmp_name']);
447 if (!is_array($arImageSize))
449 $arImageSize = [0, 0];
451 $cacheOBJ->EndDataCache([
452 'cacheImageFile' => $cacheImageFile,
453 'width' => $arImageSize[0],
454 'height' => $arImageSize[1],
455 'size' => $arImageSize[2],
458 $tmpFile =
$io->GetPhysicalName($callbackData[
'tmpFile']);
460 @rmdir(mb_substr($tmpFile, 0, -mb_strlen(
bx_basename($tmpFile))));
464 $obTargetBucket->IncFileCounter($iFileSize);
467 COption::GetOptionString(
'clouds',
'delayed_resize') ===
'Y'
471 $arDestinationSize = [];
483 $cacheOBJ->AbortDataCache();
485 $tmpFile =
$io->GetPhysicalName($callbackData[
'tmpFile']);
487 @rmdir(mb_substr($tmpFile, 0, -mb_strlen(
bx_basename($tmpFile))));
489 unlink($cacheImageFileTmp);
490 @rmdir(mb_substr($cacheImageFileTmp, 0, -mb_strlen(
bx_basename($cacheImageFileTmp))));
492 $obSourceBucket =
new CCloudStorageBucket(intval($arFile[
'HANDLER_ID']));
493 if ($obSourceBucket->Init())
495 $cacheImageFile = $obSourceBucket->GetFileSRC($arFile,
false);
503 $source = new \Bitrix\Main\File\Image\Rectangle($arFile[
'WIDTH'], $arFile[
'HEIGHT']);
504 $destination = new \Bitrix\Main\File\Image\Rectangle($arResizeParams[0][
'width'], $arResizeParams[0][
'height']);
505 $source->resize($destination, $arResizeParams[1]);
506 $cacheImageFile = $obTargetBucket->GetFileSRC($callbackData[
'fileURL'],
false);
508 $destination->getWidth(),
509 $destination->getHeight(),
510 $callbackData[
'fileSize'] ?? $obTargetBucket->GetFileSize($callbackData[
'fileURL']),
512 $cacheOBJ->EndDataCache([
513 'cacheImageFile' => $cacheImageFile,
514 'width' => $arImageSize[0],
515 'height' => $arImageSize[1],
516 'size' => $arImageSize[2],
522 elseif (is_array($callbackData[
'cacheVARS']))
524 $cacheImageFile = $callbackData[
'cacheVARS'][
'cacheImageFile'];
526 $callbackData[
'cacheVARS'][
'width'],
527 $callbackData[
'cacheVARS'][
'height'],
528 $callbackData[
'cacheVARS'][
'size'],
538 foreach (
GetModuleEvents(
'clouds',
'OnAfterResizeImage',
true) as $arEvent)
540 $cacheImageFileBefore = $cacheImageFile;
542 if ($cacheImageFile !== $cacheImageFileBefore && $cacheImageFile)
554 $destinationFile = preg_replace(
'/^https?:/i',
'', $destinationFile);
561 ,' .
$DB->DateToCharFunction(
'TIMESTAMP_X',
'FULL') .
" TIMESTAMP_X
562 from b_clouds_file_resize
563 where TO_PATH = '" .
$DB->ForSql($destinationFile) .
"'
569 public static function ResizeImageFileAdd(&$arDestinationSize, $sourceFile, $destinationFile, $arResizeParams, $errorCode = 0)
572 $destinationFile = preg_replace(
'/^https?:/i',
'', $destinationFile);
579 ,' .
$DB->DateToCharFunction(
'TIMESTAMP_X',
'FULL') .
" TIMESTAMP_X
580 from b_clouds_file_resize
581 where TO_PATH = '" .
$DB->ForSql($destinationFile) .
"'
585 if (
$a &&
$a[
'ERROR_CODE'] >= 10 &&
$a[
'ERROR_CODE'] < 20)
587 $DB->Query(
'DELETE from b_clouds_file_resize WHERE ID = ' .
$a[
'ID']);
593 $arResizeParams[
'type'] = $sourceFile[
'CONTENT_TYPE'];
594 $DB->Add(
'b_clouds_file_resize', [
595 '~TIMESTAMP_X' =>
$DB->CurrentTimeFunction(),
596 'ERROR_CODE' => intval($errorCode),
597 'PARAMS' => serialize($arResizeParams),
599 'TO_PATH' => $destinationFile,
600 'FILE_ID' => $sourceFile[
'ID'],
605 public static function ResizeImageFileDelay(&$arDestinationSize, $sourceFile, $destinationFile, $arResizeParams)
608 $destinationFile = preg_replace(
'/^https?:/i',
'', $destinationFile);
615 ,' .
$DB->DateToCharFunction(
'TIMESTAMP_X',
'FULL') .
" TIMESTAMP_X
616 from b_clouds_file_resize
617 where TO_PATH = '" .
$DB->ForSql($destinationFile) .
"'
619 if ($resize = $q->Fetch())
621 if ($resize[
'ERROR_CODE'] < 10)
623 $arResizeParams = unserialize($resize[
'PARAMS'], [
'allowed_classes' =>
false]);
628 $resize[
'ERROR_CODE'] >= 10
629 && $resize[
'ERROR_CODE'] < 20
630 && (
MakeTimeStamp($resize[
'TIMESTAMP_X']) + 300) < (time() + CTimeZone::GetOffset())
634 UPDATE b_clouds_file_resize
636 WHERE ID=' . $resize[
'ID'] .
'
638 $arResizeParams = unserialize($resize[
'PARAMS'], [
'allowed_classes' =>
false]);
651 $arSize = $arResizeParams[0];
652 $resizeType = $arResizeParams[1];
653 $arWaterMark = $arResizeParams[2];
655 $arFilters = $arResizeParams[4];
657 $source = new \Bitrix\Main\File\Image\Rectangle($sourceFile[
'WIDTH'], $sourceFile[
'HEIGHT']);
658 $destination = new \Bitrix\Main\File\Image\Rectangle($arSize[
'width'], $arSize[
'height']);
659 $bNeedCreatePicture = $source->resize($destination, $resizeType);
660 $bNeedCreatePicture |= is_array($arWaterMark) && !empty($arWaterMark);
661 $bNeedCreatePicture |= is_array($arFilters) && !empty($arFilters);
663 if ($bNeedCreatePicture)
667 $arResizeParams[
'type'] = $sourceFile[
'CONTENT_TYPE'];
668 $id =
$DB->Add(
'b_clouds_file_resize', [
669 '~TIMESTAMP_X' =>
$DB->CurrentTimeFunction(),
671 'PARAMS' => serialize($arResizeParams),
673 'TO_PATH' => $destinationFile,
674 'FILE_ID' => $sourceFile[
'ID'],
696 $path = preg_replace(
'/^https?:/i',
'',
$path);
705 ,' .
$DB->DateToCharFunction(
'TIMESTAMP_X',
'FULL') .
" TIMESTAMP_X
706 from b_clouds_file_resize
707 where TO_PATH = '" .
$DB->ForSql(
$path) .
"'
716 if ($task[
'ERROR_CODE'] == 9)
722 if ($task[
'ERROR_CODE'] >= 20)
728 if ($task[
'ERROR_CODE'] >= 10 && $task[
'ERROR_CODE'] < 20)
730 if ((
MakeTimeStamp($task[
'TIMESTAMP_X']) + 300) > (time() + CTimeZone::GetOffset()))
737 UPDATE b_clouds_file_resize
739 WHERE ID = ' . $task[
'ID'] .
'
742 $tmpFile = CFile::MakeFileArray($task[
'FROM_PATH']);
748 if (!is_array($tmpFile) || !file_exists($tmpFile[
'tmp_name']))
751 UPDATE b_clouds_file_resize
753 WHERE ID = ' . $task[
'ID'] .
'
758 $arResizeParams = unserialize($task[
'PARAMS'], [
'allowed_classes' =>
false]);
759 if (!is_array($arResizeParams))
762 UPDATE b_clouds_file_resize
764 WHERE ID = ' . $task[
'ID'] .
'
770 UPDATE b_clouds_file_resize
772 WHERE ID = ' . $task[
'ID'] .
'
775 $arSize = $arResizeParams[0];
776 $resizeType = $arResizeParams[1];
777 $arWaterMark = $arResizeParams[2];
778 $jpgQuality = $arResizeParams[3];
779 $arFilters = $arResizeParams[4];
781 $from_path =
$io->GetLogicalName($tmpFile[
'tmp_name']);
782 $to_path = rawurldecode($task[
'TO_PATH']);
783 $to_path = CFile::GetTempName(
'',
bx_basename($to_path));
785 if (!CFile::ResizeImageFile($from_path, $to_path, $arSize, $resizeType, $arWaterMark, $jpgQuality, $arFilters))
788 UPDATE b_clouds_file_resize
790 WHERE ID = ' . $task[
'ID'] .
'
796 UPDATE b_clouds_file_resize
798 WHERE ID = ' . $task[
'ID'] .
'
801 $fileToStore = CFile::MakeFileArray(
$io->GetPhysicalName($to_path));
802 if ($arResizeParams[
'type'] && !preg_match(
'/^image\\//', $fileToStore[
'type']))
804 $fileToStore[
'type'] = $arResizeParams[
'type'];
807 $baseURL = preg_replace(
'/^https?:/i',
'', $obBucket->GetFileSRC(
'/'));
808 $pathToStore = mb_substr($task[
'TO_PATH'], mb_strlen($baseURL) - 1);
809 $pathToStore = rawurldecode($pathToStore);
810 if (!$obBucket->SaveFile($pathToStore, $fileToStore))
813 UPDATE b_clouds_file_resize
815 WHERE ID = ' . $task[
'ID'] .
'
819 $obBucket->IncFileCounter($fileToStore[
'size']);
821 UPDATE b_clouds_file_resize
823 WHERE ID = ' . $task[
'ID']
831 if (!is_array($arSourceFile))
833 $file = $arSourceFile;
834 if (mb_substr($file, 0, mb_strlen(
$_SERVER[
'DOCUMENT_ROOT'])) ==
$_SERVER[
'DOCUMENT_ROOT'])
836 $file = ltrim(mb_substr($file, mb_strlen(
$_SERVER[
'DOCUMENT_ROOT'])),
'/');
839 if (!preg_match(
'#^https?://#', $file))
845 if (!is_object($bucket))
850 $filePath = mb_substr($file, mb_strlen($bucket->GetFileSRC(
'/')) - 1);
851 $filePath = rawurldecode($filePath);
854 $target = CFile::GetTempName(
'',
bx_basename($filePath));
855 $target = preg_replace(
'#[\\\\/]+#',
'/', $target);
857 if ($bucket->DownloadToFile($filePath, $target))
859 $arDestination =
$io->GetPhysicalName($target);
866 if ($arSourceFile[
'HANDLER_ID'] <= 0)
872 if (!$bucket->Init())
877 $target = CFile::GetTempName(
'', $arSourceFile[
'FILE_NAME']);
878 $target = preg_replace(
'#[\\\\/]+#',
'/', $target);
880 if ($bucket->DownloadToFile($arSourceFile, $target))
882 $arDestination[
'name'] = ($arSourceFile[
'ORIGINAL_NAME'] <>
'' ? $arSourceFile[
'ORIGINAL_NAME'] : $arSourceFile[
'FILE_NAME']);
883 $arDestination[
'size'] = $arSourceFile[
'FILE_SIZE'];
884 $arDestination[
'type'] = $arSourceFile[
'CONTENT_TYPE'];
885 $arDestination[
'description'] = $arSourceFile[
'DESCRIPTION'];
886 $arDestination[
'tmp_name'] = $target;
897 if ($arFile[
'HANDLER_ID'] <= 0)
903 if ((!$bucket->Init()) || ($bucket->READ_ONLY ===
'Y'))
908 $result = $bucket->DeleteFile(
'/' . $arFile[
'SUBDIR'] .
'/' . $arFile[
'FILE_NAME']);
911 $bucket->DecFileCounter($arFile[
'FILE_SIZE']);
914 $path =
'/resize_cache/' . $arFile[
'ID'] .
'/';
915 $arCloudFiles = $bucket->ListFiles(
$path,
true);
916 if (is_array($arCloudFiles[
'file']))
919 foreach ($arCloudFiles[
'file'] as
$i => $file_name)
921 $tmp = $bucket->DeleteFile(
$path . $file_name);
924 $bucket->DecFileCounter($arCloudFiles[
'file_size'][
$i]);
925 $delete_size += $arCloudFiles[
'file_size'][
$i];
929 if ($delete_size > 0 && COption::GetOptionInt(
'main',
'disk_space') > 0)
931 CDiskQuota::updateDiskQuota(
'file', $delete_size,
'delete');
937 DELETE FROM b_clouds_file_resize
938 WHERE FILE_ID = ' . intval($arFile[
'ID']) .
'
954 && ($obBucket->READ_ONLY ===
'N')
955 && ($obBucket->ACTIVE ===
'Y')
958 $arCloudFiles = $obBucket->ListFiles(
$path,
true);
959 if (is_array($arCloudFiles[
'file']))
961 foreach ($arCloudFiles[
'file'] as
$i => $file_name)
963 $tmp = $obBucket->DeleteFile(
$path . $file_name);
966 $obBucket->DecFileCounter($arCloudFiles[
'file_size'][
$i]);
976 if ($arFile[
'HANDLER_ID'] <= 0)
982 if (!$bucket->Init())
987 if ($bucket->READ_ONLY ===
'Y')
997 $filePath =
'/' . trim(str_replace(
'//',
'/', $newPath),
'/');
1001 $strFileExt = strrchr($arFile[
'FILE_NAME'],
'.');
1004 $newName = md5(uniqid(mt_rand(),
true)) . $strFileExt;
1005 $filePath =
'/' . $arFile[
'SUBDIR'] .
'/' . $newName;
1006 if (!$bucket->FileExists($filePath))
1013 if ($newPath ===
'')
1015 if ($arFile[
'EXTERNAL_ID'] ==
'')
1017 $arFile[
'EXTERNAL_ID'] = md5(mt_rand());
1024 ,$arFile[
'EXTERNAL_ID']
1028 $result = $bucket->FileCopy($arFile, $filePath);
1032 $copySize = $arFile[
'FILE_SIZE'];
1033 $bucket->IncFileCounter($copySize);
1041 if ($newPath !==
'')
1044 $arFile[
'SUBDIR'] = mb_substr($filePath, 1, -(mb_strlen(
bx_basename($filePath)) + 1));
1048 $arFile[
'FILE_NAME'] = $newName;
1057 if ($arFile[
'HANDLER_ID'] <= 0)
1063 if ($bucket->Init())
1065 return $bucket->GetFileSRC($arFile,
false);
1073 if (is_array($file))
1077 elseif (is_string($file) && file_exists($file))
1080 @rmdir(mb_substr($file, 0, -mb_strlen(
bx_basename($file))));
1084 public static function MoveFile($arFile, $obTargetBucket)
1087 self::$file_skip_reason =
'';
1091 if (!is_object($bucket))
1096 if (!$bucket->Init())
1098 self::$file_skip_reason =
'FAILED_TO_INIT_BUCKET';
1103 if ($bucket->ID != $obTargetBucket->ID)
1105 self::$file_skip_reason =
'FOUND_BUCKET_DOES_NOT_MATCH_TARGET';
1109 $filePath =
'/' . $arFile[
'SUBDIR'] .
'/' . $arFile[
'FILE_NAME'];
1110 $filePath = preg_replace(
'#[\\\\/]+#',
'/', $filePath);
1112 if ($bucket->FileExists($filePath))
1114 self::$file_skip_reason =
'CLOUD_FILE_EXISTS';
1118 if ($arFile[
'FILE_SIZE'] > $bucket->getService()->GetMinUploadPartSize())
1121 if (!$obUpload->isStarted())
1123 if ($arFile[
'HANDLER_ID'])
1128 self::$file_skip_reason =
'FAILED_TO_DOWNLOAD_FILE_1';
1132 if (!isset(
$ar[
'tmp_name']))
1134 self::$file_skip_reason =
'FAILED_TO_DOWNLOAD_FILE_2';
1140 $ar = CFile::MakeFileArray($arFile[
'ID']);
1141 if (!isset(
$ar[
'tmp_name']))
1143 self::$file_skip_reason =
'FAILED_TO_GET_SOURCE_FILE_INFO_1';
1148 $temp_file = CTempFile::GetDirectoryName(2,
'clouds') .
bx_basename($arFile[
'FILE_NAME']);
1149 $temp_fileX =
$io->GetPhysicalName($temp_file);
1152 if (file_exists(
$ar[
'tmp_name']))
1154 $sourceFile =
$ar[
'tmp_name'];
1156 elseif (file_exists(
$io->GetPhysicalName(
$ar[
'tmp_name'])))
1158 $sourceFile =
$io->GetPhysicalName(
$ar[
'tmp_name']);
1162 self::$file_skip_reason =
'FAILED_TO_FIND_SOURCE_FILE';
1166 if (!copy($sourceFile, $temp_fileX))
1168 self::$file_skip_reason =
'FAILED_TO_COPY_SOURCE_FILE';
1172 if ($obUpload->Start($bucket->ID, $arFile[
'FILE_SIZE'], $arFile[
'CONTENT_TYPE'], $temp_file))
1178 self::$file_skip_reason =
'FAILED_TO_START_UPLOAD';
1184 $temp_file = $obUpload->getTempFileName();
1185 $temp_fileX =
$io->GetPhysicalName($temp_file);
1187 $fp = fopen($temp_fileX,
'rb');
1188 if (!is_resource($fp))
1190 self::$file_skip_reason =
'FAILED_TO_READ_SOURCE_FILE';
1194 $pos = $obUpload->GetPos();
1195 if ($pos >= filesize($temp_fileX))
1197 if ($obUpload->Finish())
1199 $bucket->IncFileCounter(filesize($temp_fileX));
1201 if ($arFile[
'HANDLER_ID'])
1207 $ar = CFile::MakeFileArray($arFile[
'ID']);
1208 $fileNameX =
$io->GetPhysicalName(
$ar[
'tmp_name']);
1216 self::$file_skip_reason =
'FAILED_TO_FINISH_UPLOAD';
1222 self::$part_count = $obUpload->GetPartCount();
1223 self::$part_size = $obUpload->getPartSize();
1224 $part = fread($fp, self::$part_size);
1225 while ($obUpload->hasRetries())
1227 if ($obUpload->Next($part))
1233 self::$file_skip_reason =
'FAILED_TO_UPLOAD_FILE_CHUNK';
1239 if ($arFile[
'HANDLER_ID'])
1244 self::$file_skip_reason =
'FAILED_TO_DOWNLOAD_FILE_3';
1248 if (!isset(
$ar[
'tmp_name']))
1250 self::$file_skip_reason =
'FAILED_TO_DOWNLOAD_FILE_4';
1256 $ar = CFile::MakeFileArray($arFile[
'ID']);
1257 if (!isset(
$ar[
'tmp_name']))
1259 self::$file_skip_reason =
'FAILED_TO_GET_SOURCE_FILE_INFO_2';
1264 $res = $bucket->SaveFile($filePath,
$ar);
1267 $bucket->IncFileCounter(filesize(
$ar[
'tmp_name']));
1269 if ($arFile[
'HANDLER_ID'])
1278 self::$file_skip_reason =
'FAILED_TO_UPLOAD_FILE';
1284 if ($arFile[
'HANDLER_ID'])
1294 public static function OnFileSave(&$arFile, $strFileName, $strSavePath, $bForceMD5 =
false, $bSkipExt =
false, $dirAdd =
'')
1296 if (!$arFile[
'tmp_name'] && !array_key_exists(
'content', $arFile))
1301 if (array_key_exists(
'bucket', $arFile))
1303 $bucket = $arFile[
'bucket'];
1310 if (!is_object($bucket))
1315 if (!$bucket->Init())
1325 if (array_key_exists(
'bucket', $arFile))
1329 $prefix = $bucket->GetFileSRC(
'/');
1330 $subDir = mb_substr($arFile[
'tmp_name'], mb_strlen($prefix));
1331 $subDir = mb_substr($subDir, 0, -mb_strlen($newName) - 1);
1335 if (array_key_exists(
'content', $arFile))
1337 $arFile[
'tmp_name'] = CTempFile::GetFileName(
bx_basename($arFile[
'name']));
1339 $fp = fopen($arFile[
'tmp_name'],
'ab');
1342 fwrite($fp, $arFile[
'content']);
1349 && COption::GetOptionString(
'main',
'save_original_file_name',
'N') ==
'Y'
1352 if (COption::GetOptionString(
'main',
'convert_original_file_name',
'Y') ==
'Y')
1358 $newName = $strFileName;
1363 $strFileExt = ($bSkipExt ?
'' : strrchr($strFileName,
'.'));
1364 $newName = md5(uniqid(mt_rand(),
true)) . $strFileExt;
1371 if (empty($dir_add))
1375 $dir_add = md5(mt_rand());
1376 $dir_add = mb_substr($dir_add, 0, 3) .
'/' . $dir_add;
1378 $subDir = trim(trim($strSavePath,
'/') .
'/' . $dir_add,
'/');
1379 $filePath =
'/' . $subDir .
'/' . $newName;
1381 if (!$bucket->FileExists($filePath))
1389 $subDir = trim(trim($strSavePath,
'/') .
'/' . $dir_add,
'/');
1390 $filePath =
'/' . $subDir .
'/' . $newName;
1393 if (!isset($arFile[
'external_id']))
1395 $arFile[
'external_id'] = md5(mt_rand());
1402 ,$arFile[
'external_id']
1405 $targetPath = $bucket->GetFileSRC(
'/');
1406 if (mb_strpos($arFile[
'tmp_name'], $targetPath) === 0)
1410 'FILE_NAME' => mb_substr($arFile[
'tmp_name'], mb_strlen($targetPath)),
1411 'CONTENT_TYPE' => $arFile[
'type'],
1415 $arFile[
'FILE_HASH'] =
'';
1416 if (COption::GetOptionString(
'main',
'control_file_duplicates',
'N') ===
'Y')
1418 $info = $bucket->GetFileInfo(
'/' . $arDbFile[
'FILE_NAME']);
1421 $arFile[
'FILE_HASH'] =
$info[
'hash'];
1422 $copySize =
$info[
'size'];
1427 if ($arFile[
'FILE_HASH'] <>
'')
1429 $original = CFile::FindDuplicate($copySize, $arFile[
'FILE_HASH'], $bucket->ID);
1430 if ($original !==
null)
1432 $arFile[
'original_file'] = $original;
1437 if ($original ===
null)
1439 $copyPath = $bucket->FileCopy($arDbFile, $filePath);
1445 if ($copySize ===
false)
1447 $info = $bucket->GetFileInfo(
'/' . urldecode(mb_substr($copyPath, mb_strlen($targetPath))));
1450 $copySize =
$info[
'size'];
1461 if (!$bucket->SaveFile($filePath, $arFile))
1467 $arFile[
'FILE_HASH'] =
'';
1469 if (COption::GetOptionString(
'main',
'control_file_duplicates',
'N') ===
'Y')
1471 $info = $bucket->GetFileInfo($filePath);
1474 $arFile[
'FILE_HASH'] =
$info[
'hash'];
1475 $size =
$info[
'size'];
1480 if ($arFile[
'FILE_HASH'] <>
'')
1482 $original = CFile::FindDuplicate($size, $arFile[
'FILE_HASH'], $bucket->ID);
1483 if ($original !==
null)
1485 $arFile[
'original_file'] = $original;
1488 $bucket->DeleteFile($filePath);
1494 $arFile[
'HANDLER_ID'] = $bucket->ID;
1495 $arFile[
'WIDTH'] = 0;
1496 $arFile[
'HEIGHT'] = 0;
1498 if ($original ===
null)
1500 $arFile[
'SUBDIR'] = $subDir;
1501 $arFile[
'FILE_NAME'] = $newName;
1506 $arFile[
'SUBDIR'] = $original->getFile()->getSubdir();
1507 $arFile[
'FILE_NAME'] = $original->getFile()->getFileName();
1510 if (array_key_exists(
'bucket', $arFile))
1512 $arFile[
'WIDTH'] = $arFile[
'width'];
1513 $arFile[
'HEIGHT'] = $arFile[
'height'];
1514 $arFile[
'size'] = $arFile[
'file_size'];
1516 elseif ($copySize !==
false)
1518 $arFile[
'WIDTH'] = $arFile[
'width'];
1519 $arFile[
'HEIGHT'] = $arFile[
'height'];
1520 $arFile[
'size'] = $copySize;
1523 if ($original ===
null)
1525 $bucket->IncFileCounter($copySize);
1537 if ($original ===
null)
1539 $fileSize = filesize($arFile[
'tmp_name']);
1540 $bucket->IncFileCounter($fileSize);
1549 $image = new \Bitrix\Main\File\Image($arFile[
'tmp_name']);
1550 $flashEnabled = !CFile::IsImage($arFile[
'ORIGINAL_NAME'], $arFile[
'type']);
1551 $info = $image->getInfo($flashEnabled);
1554 $arFile[
'WIDTH'] =
$info->getWidth();
1555 $arFile[
'HEIGHT'] =
$info->getHeight();
1559 if (isset($arFile[
'old_file']))
1561 CFile::Delete($arFile[
'old_file']);
1570 $arFile[
'HANDLER_ID']
1572 ,$arFile[
'FILE_NAME']
1579 if ($original->getHandlerId() > 0)
1582 if ($bucket->Init())
1584 $duplicatePath =
'/' . $duplicate->getSubdir() .
'/' . $duplicate->getFileName();
1587 $result = $bucket->DeleteFile($duplicatePath, $duplicate->getFileSize());
1590 $bucket->DecFileCounter($duplicate->getFileSize());
1600 $date = new \Bitrix\Main\Type\DateTime();
1604 '<TIMESTAMP_X' => $date,
1608 while ($saveFile = $savedFiles->fetchObject())
1610 $dbFile = CFile::GetList([], [
1611 'EXTERNAL_ID' => $saveFile->getExternalId(),
1612 'SUBDIR' => $saveFile->getSubdir(),
1613 'FILE_NAME' => $saveFile->getFileName(),
1614 'HANDLER_ID' => $saveFile->getBucketId(),
1616 if ($dbFile->Fetch())
1618 $saveFile->delete();
1622 $bucketId = $saveFile->getBucketId();
1623 if (!isset($buckets[$bucketId]))
1625 $buckets[$bucketId] = new \CCloudStorageBucket($bucketId);
1627 $bucket = $buckets[$bucketId];
1629 if ($bucket->Init())
1631 $filePath =
'/' . $saveFile->getSubdir() .
'/' . $saveFile->getFileName();
1632 if ($bucket->DeleteFile($filePath))
1634 $fileSize = $saveFile->getFileSize();
1637 $bucket->DecFileCounter($fileSize);
1640 $saveFile->delete();
1647 return 'CCloudStorage::CleanUp();';
1654 if ($bucket[
'ACTIVE'] ==
'Y')
1657 if ($obBucket->Init())
1659 $prefix = $obBucket->GetFileSRC(
'/');
1660 if (mb_substr($file_name, 0, mb_strlen($prefix)) === $prefix)
1674 if ($bucket[
'ACTIVE'] ==
'Y')
1677 if ($obBucket->Init() && $obBucket->FileExists($urn))
1679 $uri = $obBucket->GetFileSRC($urn);
1681 if ($log_descr && COption::GetOptionString(
'clouds',
'log_404_errors') ===
'Y')
1696 if (!
$USER->CanDoOperation(
'clouds_browse'))
1703 if (defined(
'BX_CLOUDS_UNINSTALLED'))
1709 'parent_menu' =>
'global_menu_content',
1710 'section' =>
'clouds',
1714 'icon' =>
'clouds_menu_icon',
1715 'page_icon' =>
'clouds_page_icon',
1716 'items_id' =>
'menu_clouds',
1721 while ($arBucket = $rsBuckets->Fetch())
1724 'text' => $arBucket[
'BUCKET'],
1725 'url' =>
'clouds_file_list.php?lang=' . LANGUAGE_ID .
'&bucket=' . $arBucket[
'ID'] .
'&path=/',
1727 'clouds_file_list.php?bucket=' . $arBucket[
'ID'],
1730 'page_icon' =>
'clouds_page_icon',
1731 'items_id' =>
'menu_clouds_bucket_' . $arBucket[
'ID'],
1732 'module_id' =>
'clouds',
1737 if (!empty(
$aMenu[
'items']))
1747 if ($obList->table_id !==
'tbl_fileman_admin')
1752 if (!is_object(
$USER) || !
$USER->CanDoOperation(
'clouds_upload'))
1757 static $clouds =
null;
1758 if (!isset($clouds))
1762 while ($arStorage = $rsClouds->Fetch())
1764 if ($arStorage[
'READ_ONLY'] ==
'N' && $arStorage[
'ACTIVE'] ==
'Y')
1766 $clouds[$arStorage[
'ID']] = $arStorage[
'BUCKET'];
1776 foreach ($obList->aRows as $obRow)
1778 if ($obRow->arRes[
'TYPE'] ===
'F')
1780 $ID =
'F' . $obRow->arRes[
'NAME'];
1781 $file = $obRow->arRes[
'NAME'];
1782 $path = mb_substr($obRow->arRes[
'ABS_PATH'], 0, -mb_strlen($file));
1785 foreach ($clouds as $id => $bucket)
1789 'ACTION' => $s =
"if(confirm('" .
GetMessage(
'CLO_STORAGE_UPLOAD_CONF') .
"')) jsUtils.Redirect([], '" . CUtil::AddSlashes(
'/bitrix/admin/clouds_file_list.php?lang=' . LANGUAGE_ID .
'&bucket=' . urlencode($id) .
'&path=' . urlencode(
$path) .
'&ID=' . urlencode(
$ID) .
'&action=upload&' .
bitrix_sessid_get()) .
"');"
1793 $obRow->aActions[] = [
1794 'TEXT' =>
GetMessage(
'CLO_STORAGE_UPLOAD_MENU'),
1795 'MENU' => $arSubMenu,
1805 if ($bucket[
'ACTIVE'] ===
'Y')
1817 $upload_dir =
'/' . trim(COption::GetOptionString(
'main',
'upload_dir',
'upload'),
'/') .
'/';
1818 $request_uri = rawurldecode(
$_SERVER[
'REQUEST_URI']);
1822 if ($arBucket[
'ACTIVE'] ==
'Y')
1825 if ($obBucket->Init())
1827 $bucketUrl = $obBucket->GetFileSRC(
'/');
1828 $bucketPrefix = rtrim(parse_url($bucketUrl, PHP_URL_PATH),
'/');
1829 $prefixMatch = $bucketPrefix ?
'(?:' . $bucketPrefix .
'|)' :
'';
1832 COption::GetOptionString(
'clouds',
'delayed_resize') ===
'Y'
1833 && preg_match(
'#^' . $prefixMatch .
'(/resize_cache/.*$)#', $request_uri, $match)
1836 session_write_close();
1837 $to_file = $obBucket->GetFileSRC($match[1],
false);
1840 $cache_time = 3600 * 24 * 30;
1841 header(
'Cache-Control: max-age=' . $cache_time);
1842 header(
'Expires: ' . gmdate(
'D, d M Y H:i:s', time() + $cache_time) .
' GMT');
1843 header_remove(
'Pragma');
1844 LocalRedirect(\
Bitrix\Main\Web\Uri::urnEncode($to_file,
'UTF-8'),
true,
'301 Moved Permanently');
1848 !preg_match(
'/[?&]/', $request_uri)
1849 && $obBucket->FileExists($request_uri)
1852 if (COption::GetOptionString(
'clouds',
'log_404_errors') ===
'Y')
1858 elseif (mb_strpos($request_uri, $upload_dir) === 0)
1860 $check_url = mb_substr($request_uri, mb_strlen($upload_dir) - 1);
1861 if ($obBucket->FileExists($check_url))
1863 if (COption::GetOptionString(
'clouds',
'log_404_errors') ===
'Y')
1879 'CLOUDS_404' =>
'[CLOUDS_404] ' .
GetMessage(
'CLO_404_ON_MOVED_FILE'),
1883 public static function translit($file_name, $safe_chars =
'')
1885 return CUtil::translit($file_name, LANGUAGE_ID, [
1886 'safe_chars' =>
'-. ' . $safe_chars,
1887 'change_case' =>
false,
1899 $fixedContentType =
'';
1901 if ($arFile[
'CONTENT_TYPE'] ===
'image/jpg')
1903 $fixedContentType =
'image/jpeg';
1907 $hexContentType = unpack(
'H*', $arFile[
'CONTENT_TYPE']);
1909 $hexContentType[1] ===
'e0f3e4e8ee2f6d706567'
1910 || $hexContentType[1] ===
'd0b0d183d0b4d0b8d0be2f6d706567'
1913 $fixedContentType =
'audio/mpeg';
1917 if ($fixedContentType !==
'')
1919 $arFile[
'CONTENT_TYPE'] = $fixedContentType;
1922 SET CONTENT_TYPE = '" .
$DB->ForSQL($fixedContentType) .
"'
1923 WHERE ID = " . intval($arFile[
'ID']) .
'
1925 CFile::CleanCache($arFile[
'ID']);
static deleteByFilePath($bucketId, $filePath)
static endFileOperation($bucketId, $subDir, $fileName)
static setFileSize($bucketId, $subDir, $fileName, $fileSize)
static startFileOperation($bucketId, $subDir, $fileName, $externalId)
static getList(array $parameters=array())
static GetOptionString($module_id, $name, $def="", $site=false, $bExactSite=false)
static GetList($arOrder=[], $arFilter=[], $arSelect=[])
static GetServiceDescription($ID)
static OnAfterFileDeleteDuplicate($original, $duplicate)
static ResizeImageFileDelay(&$arDestinationSize, $sourceFile, $destinationFile, $arResizeParams)
const FILE_PARTLY_UPLOADED
static OnAdminListDisplay(&$obList)
static FixFileContentType(&$arFile)
static GetServiceByID($ID)
static GetImageSize($path)
static OnBeforeResizeImage($arFile, $arResizeParams, &$callbackData, &$bNeedResize, &$sourceImageFile, &$cacheImageFileTmp)
static OnMakeFileArray($arSourceFile, &$arDestination)
static ResizeImageFileGet($destinationFile)
static GetServiceLocationList($ID)
static FindBucketByFile($file_name)
static MoveFile($arFile, $obTargetBucket)
static translit($file_name, $safe_chars='')
static HasActiveBuckets()
static _delete_file($file)
static OnBuildGlobalMenu(&$aGlobalMenu, &$aModuleMenu)
static FindBucketForFile($arFile, $strFileName)
static OnFileDelete($arFile)
static OnFileCopy(&$arFile, $newPath='')
static FindFileURIByURN($urn, $log_descr='')
static OnAfterFileSave($arFile)
static OnFileSave(&$arFile, $strFileName, $strSavePath, $bForceMD5=false, $bSkipExt=false, $dirAdd='')
static OnGetFileSRC($arFile)
static ResizeImageFileCheck($obBucket, $path)
static DeleteDirFilesEx($path)
static ResizeImageFileAdd(&$arDestinationSize, $sourceFile, $destinationFile, $arResizeParams, $errorCode=0)
static URLEncode($str, $charset, $file_name=false)
static Log($SEVERITY, $AUDIT_TYPE_ID, $MODULE_ID, $ITEM_ID, $DESCRIPTION=false, $SITE_ID=false)
static MakeFileArray($path, $mimetype=false, $skipInternal=false, $external_id="")
if(!is_array($prop["VALUES"])) $tmp
$_SERVER["DOCUMENT_ROOT"]
if(( $ACTION=='EXPORT_EDIT'||$ACTION=='EXPORT_COPY') &&$STEP==1) if($STEP > 1) if(( $ACTION=='EXPORT_EDIT'||$ACTION=='EXPORT_COPY') &&$STEP==2) if($STEP >2) $aMenu
global $arCloudImageSizeCache
const BX_CHECK_SHORT_URI(str_starts_with($requestUri, "/bitrix/admin/"))
if(file_exists($_SERVER['DOCUMENT_ROOT'] . "/urlrewrite.php")) $uri
if($NS['step']==6) if( $NS[ 'step']==7) if(COption::GetOptionInt('main', 'disk_space', 0) > 0) $info
ExecuteModuleEventEx($arEvent, $arParams=[])
RemoveScriptExtension($check_name)
bx_basename($path, $ext="")
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
GetMessage($name, $aReplace=null)
MakeTimeStamp($datetime, $format=false)
bitrix_sessid_get($varname='sessid')
LocalRedirect($url, $skip_security_check=false, $status="302 Found")
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)