Uploader::upload

  1. Bitrix24 API (v. 23.675.0)
  2. ui
  3. Uploader
  4. upload
  • Модуль: ui
  • Путь к файлу: ~/bitrix/modules/ui/lib/FileUploader/Uploader.php
  • Класс: BitrixUIFileUploaderUploader
  • Вызов: Uploader::upload
public function upload(Chunk $chunk, string $token = null): UploadResult
{
	$controller = $this->getController();
	$uploadResult = new UploadResult();
	if ($chunk->isFirst())
	{
		// Common file validation (uses in CFile::SaveFile)
		$commitOptions = $controller->getCommitOptions();
		$error = CFile::checkFile(
			[
				'name' => $chunk->getName(),
				'size' => $chunk->getFileSize(),
				'type' => $chunk->getType()
			],
			0,
			false,
			false,
			$commitOptions->isForceRandom(),
			$commitOptions->isSkipExtension()
		);

		if ($error !== '')
		{
			return $this->handleUploadError(
				$uploadResult->addError(new UploaderError('CHECK_FILE_FAILED', $error)),
				$controller
			);
		}

		// Controller Validation
		$validationResult = $chunk->validate($controller->getConfiguration());
		if (!$validationResult->isSuccess())
		{
			return $this->handleUploadError($uploadResult->addErrors($validationResult->getErrors()), $controller);
		}

		['width' => $width, 'height' => $height] = $validationResult->getData();
		$chunk->setWidth((int)$width);
		$chunk->setHeight((int)$height);

		$uploadRequest = new UploadRequest($chunk->getName(), $chunk->getType(), $chunk->getSize());
		$uploadRequest->setWidth($chunk->getWidth());
		$uploadRequest->setHeight($chunk->getHeight());

		// Temporary call for compatibility
		// $canUploadResult = $controller->canUpload($uploadRequest);
		$canUploadResult = call_user_func([$controller, 'canUpload'], $uploadRequest);
		if (($canUploadResult instanceof CanUploadResult) && !$canUploadResult->isSuccess())
		{
			return $this->handleUploadError($uploadResult->addErrors($canUploadResult->getErrors()), $controller);
		}
		else if (!is_bool($canUploadResult) || $canUploadResult === false)
		{
			return $this->handleUploadError(
				$uploadResult->addError(new UploaderError(UploaderError::FILE_UPLOAD_ACCESS_DENIED)),
				$controller
			);
		}

		$createResult = TempFile::create($chunk, $controller);
		if (!$createResult->isSuccess())
		{
			return $this->handleUploadError($uploadResult->addErrors($createResult->getErrors()), $controller);
		}

		/** @var TempFile $tempFile */
		$tempFile = $createResult->getData()['tempFile'];
		$uploadResult->setTempFile($tempFile);
		$uploadResult->setToken($this->generateToken($tempFile));

		$controller->onUploadStart($uploadResult);
		if (!$uploadResult->isSuccess())
		{
			return $this->handleUploadError($uploadResult, $controller);
		}
	}
	else
	{
		if (empty($token))
		{
			return $this->handleUploadError(
				$uploadResult->addError(new UploaderError(UploaderError::EMPTY_TOKEN)),
				$controller
			);
		}

		$guid = $this->getGuidFromToken($token);
		if (!$guid)
		{
			return $this->handleUploadError(
				$uploadResult->addError(new UploaderError(UploaderError::INVALID_SIGNATURE)),
				$controller
			);
		}

		$tempFile = TempFileTable::getList([
			'filter' => [
				'=GUID' => $guid,
				'=UPLOADED' => false,
			],
		])->fetchObject();

		if (!$tempFile)
		{
			return $this->handleUploadError(
				$uploadResult->addError(new UploaderError(UploaderError::UNKNOWN_TOKEN)),
				$controller
			);
		}

		$uploadResult->setTempFile($tempFile);
		$uploadResult->setToken($token);

		$appendResult = $tempFile->append($chunk);
		if (!$appendResult->isSuccess())
		{
			return $this->handleUploadError($uploadResult->addErrors($appendResult->getErrors()), $controller);
		}
	}

	if ($uploadResult->isSuccess() && $chunk->isLast())
	{
		$commitResult = $tempFile->commit($controller->getCommitOptions());
		if (!$commitResult->isSuccess())
		{
			return $this->handleUploadError($uploadResult->addErrors($commitResult->getErrors()), $controller);
		}

		$fileInfo = $this->createFileInfo($uploadResult->getToken());
		$uploadResult->setFileInfo($fileInfo);
		$uploadResult->setDone(true);

		$controller->onUploadComplete($uploadResult);
		if (!$uploadResult->isSuccess())
		{
			return $this->handleUploadError($uploadResult, $controller);
		}
	}

	return $uploadResult;
}

Добавить комментарий