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