- Модуль: 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;
}
}
}