• Модуль: clouds
  • Путь к файлу: ~/bitrix/modules/clouds/classes/general/storage.php
  • Класс: CCloudStorage
  • Вызов: CCloudStorage::MoveFile
static function MoveFile($arFile, $obTargetBucket)
{
	$io = CBXVirtualIo::GetInstance();
	self::$file_skip_reason = '';

	//Try to find suitable bucket for the file
	$bucket = CCloudStorage::FindBucketForFile($arFile, $arFile["FILE_NAME"]);
	if (!is_object($bucket))
	{
		return CCloudStorage::FILE_SKIPPED;
	}

	if (!$bucket->Init())
	{
		self::$file_skip_reason = 'FAILED_TO_INIT_BUCKET';
		return CCloudStorage::FILE_SKIPPED;
	}

	//Check if this is same bucket as the target
	if ($bucket->ID != $obTargetBucket->ID)
	{
		self::$file_skip_reason = 'FOUND_BUCKET_DOES_NOT_MATCH_TARGET';
		return CCloudStorage::FILE_SKIPPED;
	}

	$filePath = "/".$arFile["SUBDIR"]."/".$arFile["FILE_NAME"];
	$filePath = preg_replace("#[\\\/]+#", "/", $filePath);

	if ($bucket->FileExists($filePath))
	{
		self::$file_skip_reason = 'CLOUD_FILE_EXISTS';
		return CCloudStorage::FILE_SKIPPED;
	}

	if ($arFile["FILE_SIZE"] > $bucket->GetService()->GetMinUploadPartSize())
	{
		$obUpload = new CCloudStorageUpload($filePath);
		if (!$obUpload->isStarted())
		{
			if ($arFile["HANDLER_ID"])
			{
				$ar = array();
				if (!CCloudStorage::OnMakeFileArray($arFile, $ar))
				{
					self::$file_skip_reason = 'FAILED_TO_DOWNLOAD_FILE_1';
					return CCloudStorage::FILE_SKIPPED;
				}

				if (!isset($ar["tmp_name"]))
				{
					self::$file_skip_reason = 'FAILED_TO_DOWNLOAD_FILE_2';
					return CCloudStorage::FILE_SKIPPED;
				}
			}
			else
			{
				$ar = CFile::MakeFileArray($arFile["ID"]);
				if (!isset($ar["tmp_name"]))
				{
					self::$file_skip_reason = 'FAILED_TO_GET_SOURCE_FILE_INFO_1';
					return CCloudStorage::FILE_SKIPPED;
				}
			}

			$temp_file = CTempFile::GetDirectoryName(2, "clouds").bx_basename($arFile["FILE_NAME"]);
			$temp_fileX = $io->GetPhysicalName($temp_file);
			CheckDirPath($temp_fileX);

			if (file_exists($ar["tmp_name"]))
			{
				$sourceFile = $ar["tmp_name"];
			}
			elseif (file_exists($io->GetPhysicalName($ar["tmp_name"])))
			{
				$sourceFile = $io->GetPhysicalName($ar["tmp_name"]);
			}
			else
			{
				self::$file_skip_reason = 'FAILED_TO_FIND_SOURCE_FILE';
				return CCloudStorage::FILE_SKIPPED;
			}

			if (!copy($sourceFile, $temp_fileX))
			{
				self::$file_skip_reason = 'FAILED_TO_COPY_SOURCE_FILE';
				return CCloudStorage::FILE_SKIPPED;
			}

			if ($obUpload->Start($bucket->ID, $arFile["FILE_SIZE"], $arFile["CONTENT_TYPE"], $temp_file))
			{
				return CCloudStorage::FILE_PARTLY_UPLOADED;
			}
			else
			{
				self::$file_skip_reason = 'FAILED_TO_START_UPLOAD';
				return CCloudStorage::FILE_SKIPPED;
			}
		}
		else
		{
			$temp_file = $obUpload->getTempFileName();
			$temp_fileX = $io->GetPhysicalName($temp_file);

			$fp = fopen($temp_fileX, "rb");
			if (!is_resource($fp))
			{
				self::$file_skip_reason = 'FAILED_TO_READ_SOURCE_FILE';
				return CCloudStorage::FILE_SKIPPED;
			}

			$pos = $obUpload->getPos();
			if ($pos > filesize($temp_fileX))
			{
				if ($obUpload->Finish())
				{
					$bucket->IncFileCounter(filesize($temp_fileX));

					if ($arFile["HANDLER_ID"])
					{
						self::_delete_file($arFile);
					}
					else
					{
						$ar = CFile::MakeFileArray($arFile["ID"]);
						$fileNameX = $io->GetPhysicalName($ar["tmp_name"]);
						self::_delete_file($fileNameX);
					}

					return CCloudStorage::FILE_MOVED;
				}
				else
				{
					self::$file_skip_reason = 'FAILED_TO_FINISH_UPLOAD';
					return CCloudStorage::FILE_SKIPPED;
				}
			}

			fseek($fp, $pos);
			self::$part_count = $obUpload->GetPartCount();
			self::$part_size = $obUpload->getPartSize();
			$part = fread($fp, self::$part_size);
			while ($obUpload->hasRetries())
			{
				if ($obUpload->Next($part))
				{
					return CCloudStorage::FILE_PARTLY_UPLOADED;
				}
			}

			self::$file_skip_reason = 'FAILED_TO_UPLOAD_FILE_CHUNK';
			return CCloudStorage::FILE_SKIPPED;
		}
	}
	else
	{
		if ($arFile["HANDLER_ID"])
		{
			$ar = array();
			if (!CCloudStorage::OnMakeFileArray($arFile, $ar))
			{
				self::$file_skip_reason = 'FAILED_TO_DOWNLOAD_FILE_3';
				return CCloudStorage::FILE_SKIPPED;
			}

			if (!isset($ar["tmp_name"]))
			{
				self::$file_skip_reason = 'FAILED_TO_DOWNLOAD_FILE_4';
				return CCloudStorage::FILE_SKIPPED;
			}
		}
		else
		{
			$ar = CFile::MakeFileArray($arFile["ID"]);
			if (!isset($ar["tmp_name"]))
			{
				self::$file_skip_reason = 'FAILED_TO_GET_SOURCE_FILE_INFO_2';
				return CCloudStorage::FILE_SKIPPED;
			}
		}

		$res = $bucket->SaveFile($filePath, $ar);
		if ($res)
		{
			$bucket->IncFileCounter(filesize($ar["tmp_name"]));

			if ($arFile["HANDLER_ID"])
			{
				self::_delete_file($arFile);
			}
			else
			{
				self::_delete_file($ar["tmp_name"]);
			}

			self::$file_skip_reason = 'FAILED_TO_UPLOAD_FILE';
			return CCloudStorage::FILE_MOVED;
		}
		else
		{        //delete temporary copy
			if ($arFile["HANDLER_ID"])
			{
				self::_delete_file($ar["tmp_name"]);
			}

			return CCloudStorage::FILE_SKIPPED;
		}

	}
}