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;
}