• Модуль: ui
  • Путь к файлу: ~/bitrix/modules/ui/lib/FileUploader/TempFile.php
  • Класс: BitrixUIFileUploaderTempFile
  • Вызов: TempFile::appendToCloud
private function appendToCloud(Chunk $chunk): Result
{
	$result = new Result();
	$bucket = $this->getBucket();
	if (!$bucket)
	{
		return $result->addError(new UploaderError(UploaderError::CLOUD_EMPTY_BUCKET));
	}

	$minUploadSize = $bucket->getService()->getMinUploadPartSize();
	if ($chunk->getSize() < $minUploadSize && !$chunk->isLast())
	{
		$postMaxSize = CUtil::unformat(ini_get('post_max_size'));
		$uploadMaxFileSize = CUtil::unformat(ini_get('upload_max_filesize'));

		return $result->addError(
			new UploaderError(
				UploaderError::CLOUD_INVALID_CHUNK_SIZE,
				[
					'chunkSize' => $chunk->getSize(),
					'minUploadSize' => $minUploadSize,
					'postMaxSize' => $postMaxSize,
					'uploadMaxFileSize' => $uploadMaxFileSize,
				]
			)
		);
	}

	$cloudUpload = new CCloudStorageUpload($this->getPath());
	if (!$cloudUpload->isStarted() && !$cloudUpload->start($bucket->ID, $chunk->getFileSize(), $chunk->getType()))
	{
		return $result->addError(new UploaderError(UploaderError::CLOUD_START_UPLOAD_FAILED));
	}

	if ($cloudUpload->getPos() === doubleval($chunk->getEndRange() + 1))
	{
		// We already have this part of the file.
		if ($chunk->isLast() && !$cloudUpload->finish())
		{
			return $result->addError(new UploaderError(UploaderError::CLOUD_FINISH_UPLOAD_FAILED));
		}

		return $result;
	}

	$fileContent = $chunk->getFile()->isExists() ? $chunk->getFile()->getContents() : false;
	if ($fileContent === false)
	{
		return $result->addError(new UploaderError(UploaderError::CLOUD_GET_CONTENTS_FAILED));
	}

	$fails = 0;
	$success = false;
	while ($cloudUpload->hasRetries())
	{
		if ($cloudUpload->next($fileContent))
		{
			$success = true;
			break;
		}

		$fails++;
	}

	if (!$success)
	{
		// TODO: CCloudStorageUpload::CleanUp
		return $result->addError(new UploaderError(UploaderError::CLOUD_UPLOAD_FAILED, ['fails' => $fails]));
	}

	if ($chunk->isLast() && !$cloudUpload->finish())
	{
		// TODO: CCloudStorageUpload::CleanUp
		return $result->addError(new UploaderError(UploaderError::CLOUD_FINISH_UPLOAD_FAILED));
	}

	return $result;
}