• Модуль: main
  • Путь к файлу: ~/bitrix/modules/main/lib/ui/uploader/package.php
  • Класс: BitrixMainUIUploaderPackage
  • Вызов: Package::checkPost
public function checkPost($fileLimits)
{
	$unescapedPost = self::unescape(
	Context::getCurrent()->getRequest()->getPostList()->toArrayRaw()
		?? Context::getCurrent()->getRequest()->getPostList()->toArray()
	);
	$postFiles = $unescapedPost[Uploader::FILE_NAME];
	$post = $unescapedPost[Uploader::INFO_NAME];
	if (!(is_array($post) &&
		$this->log["filesCount"] > 0 &&
		$post["filesCount"] == $this->log["filesCount"] &&
		is_array($postFiles) &&
		!empty($postFiles))
	)
		return array();

	$files =  self::unescape(
		Context::getCurrent()->getRequest()->getFileList()->toArrayRaw()
		?? Context::getCurrent()->getRequest()->getFileList()->toArray()
	);
	$files = $files[Uploader::FILE_NAME];

	$type = $post["type"] ?? null;
	if ($type !== "brief") // If it is IE8
	{
		$error = "";
		if ($this->log["executeStatus"] != "executed")
		{
			$eventName = ($this->cidLog["executeStatus"] === "executed" ? "onUploadIsContinued" : "onUploadIsStarted");
			$this->cidLog["executeStatus"] = "executed";

			foreach(GetModuleEvents(Uploader::EVENT_NAME, $eventName, true) as $event)
			{
				if (ExecuteModuleEventEx($event, array(&$this->log, &$this->cidLog, &$unescapedPost, &$files, &$error)) === false)
					throw new NotImplementedException($error);
			}
			$eventName = "onPackageIsStarted";
		}
		else
		{
			$eventName = "onPackageIsContinued";
		}

		$this->log["executeStatus"] = "executed";
		foreach(GetModuleEvents(Uploader::EVENT_NAME, $eventName, true) as $event)
		{
			if (ExecuteModuleEventEx($event, array(&$this->log, &$this->cidLog, &$unescapedPost, &$files, &$error)) === false)
				throw new NotImplementedException($error);
		}
	}

	$filesRaw = array();
	// $_POST
	foreach($postFiles as $fileID => $file)
	{
		if (is_array($file))
		{
			if (isset($file["removed"]))
			{
				$f = array_merge($file, array("id" => $fileID));
				File::deleteCache($this, $f);
				$filesRaw[] = [
					'id' => $fileID,
					'removed' => 'Y'
				];
			}
			else if (isset($file["restored"]))
			{
				$f = array_merge($file, array("id" => $fileID));
				if ($f["restored"] === "Y")
				{
					File::deleteCache($this, $f);
				}
				else
				{
					$filesRaw[] = $f;
				}
			}
			if (array_key_exists("files", $file) && is_array($file["files"]))
			{
				foreach ($file["files"] as $serviceName => $f)
				{
					if (is_array($f) && array_key_exists("tmp_url", $f))
					{
						/**
						 * $file = array(
						 *  "id" => "file4545454",
						 *  "name" => "Foxes.jpg",
						 *  "~name" => "default",
						 *  "type" => "image/jpg"
						 * );
						 */
						$filesRaw[] = array_merge($f, array(
							"id" => $fileID,
							"code" => $serviceName
						));
					}
				}
			}
		}
	}
	// $_FILES
	if (is_array($files))
	{
		foreach($files["name"] as $fileID => $fileNames)
		{
			if (is_array($fileNames))
			{
				foreach ($fileNames as $fileName => $val)
				{
					$filesRaw[] = array(
						"id" => $fileID,
						"code" => $fileName,
						"tmp_name" => $files["tmp_name"][$fileID][$fileName],
						"type" => $files["type"][$fileID][$fileName],
						"size" => $files["size"][$fileID][$fileName],
						"error" => $files["error"][$fileID][$fileName]
					);
				}
			}
			else
			{
				$filesRaw[] = array(
					"id" => $fileID,
					"code" => $fileNames,
					"tmp_name" => $files["tmp_name"][$fileID],
					"type" => $files["type"][$fileID],
					"size" => $files["size"][$fileID],
					"error" => $files["error"][$fileID]
				);
			}
		}
	}

	$file = null;
	$filesFromLog = is_array($this->log["files"]) ? $this->log["files"] : array();
	$filesOnThisPack = array();
	if ($fileRaw = reset($filesRaw))
	{
		$this->log["uploadStatus"] = "inprogress";
		do
		{
			if (!array_key_exists($fileRaw["id"], $postFiles))
				continue;
			if (!$this->checkTime())
				break;
			if (!array_key_exists($fileRaw["id"], $filesOnThisPack))
			{
				if (!empty($fileRaw["removed"]))
				{
					$file = new FileRemoved($this, [
						'id' => $fileRaw['id'],
						'name' => $postFiles[$fileRaw["id"]]["name"]
					]);
				}
				else
				{
					$file = new File($this, array(
							"id" => $fileRaw["id"],
							"name" => $postFiles[$fileRaw["id"]]["name"],
							"type" => $postFiles[$fileRaw["id"]]["type"],
							"size" => $postFiles[$fileRaw["id"]]["size"]
						) + (is_array($postFiles[$fileRaw["id"]]) ? $postFiles[$fileRaw["id"]] : []));
					if (isset($fileRaw["restored"]))
					{
						if ($file->isExecuted())
							$file->setExecuteStatus("none");
						$fileRaw = $file->getFile("default");
						if (empty($fileRaw) || !is_array($fileRaw))
							$file->addError(new Error(BitrixMainLocalizationLoc::getMessage("BXU_FileIsNotRestored"), "BXU350.0"));
					}
				}
				$filesOnThisPack[$fileRaw["id"]] = $file;
			}
			/* @var File $file */
			$file = $filesOnThisPack[$fileRaw["id"]];
			if ($file->hasError() || $file instanceof FileRemoved)
			{
				continue;
			}
			$result = File::checkFile($fileRaw, $file, $fileLimits + array("path" => $this->getPath()));
			if ($result->isSuccess() && ($result = $file->saveFile($fileRaw, $this->getStorage(), $this->getCopies())) && $result->isSuccess() &&
				$type !== "brief" &&
				$file->isUploaded() &&
				!$file->isExecuted()
			)
			{
				$file->setExecuteStatus("executed");
				$fileArray = $file->toArray();
				foreach(GetModuleEvents(Uploader::EVENT_NAME, "onFileIsUploaded", true) as $event)
				{
					$error = "";
					if (!ExecuteModuleEventEx($event, array($file->getHash(), &$fileArray,
						&$this->log,
						&$this->cidLog,
						&$error)))
					{
						$result->addError(new Error($error, "BXU350.1"));
						break;
					}
				}
				$file->fromArray($fileArray);
			}
			if (!$result->isSuccess())
				$file->addError($result->getErrorCollection()->current());
		} while ($fileRaw = next($filesRaw));
	}

	$response = array();
	/* @var File $file */
	foreach ($filesOnThisPack as $file)
	{
		$response[$file->getId()] = $file->toArray();
		$filesFromLog[$file->getId()] = $response[$file->getId()]["status"] = $file->isUploaded() ? "uploaded" : "inprogress";
		if ($file->hasError())
		{
			$response[$file->getId()]["status"] = "error";
			$response[$file->getId()]["error"] = $file->getErrorMessage();
			$filesFromLog[$file->getId()] = "error";
		}
	}
	$this->files = $filesOnThisPack;
	$this->log["files"] = $filesFromLog;
	$declaredFiles = (int) $this->log["filesCount"];

	$cnt = 0;
	foreach ($filesFromLog as $status)
		$cnt += ($status == "uploaded" || $status == "error" ? 1 : 0);

	if ($declaredFiles > 0 && $declaredFiles <= $cnt)
	{
		if ($type !== "brief") // If it is IE8
		{
			$this->log["uploadStatus"] = "uploaded";
			$error = "";
			foreach(GetModuleEvents(Uploader::EVENT_NAME, "onPackageIsFinished", true) as $event)
			{
				if (ExecuteModuleEventEx($event, array(&$this->log, &$this->cidLog, &$unescapedPost, &$response, &$error)) === false)
					throw new NotImplementedException($error);
			}
		}
	}
	return $response;
}