34 $error = \CFile::checkFile(
43 $commitOptions->isForceRandom(),
44 $commitOptions->isSkipExtension()
49 return $this->handleUploadError(
57 if (!$validationResult->isSuccess())
59 return $this->handleUploadError($uploadResult->addErrors($validationResult->getErrors()),
$controller);
62 [
'width' =>
$width,
'height' => $height] = $validationResult->getData();
67 $uploadRequest->setWidth($chunk->
getWidth());
68 $uploadRequest->setHeight($chunk->
getHeight());
72 $canUploadResult = call_user_func([
$controller,
'canUpload'], $uploadRequest);
73 if (($canUploadResult instanceof CanUploadResult) && !$canUploadResult->isSuccess())
75 return $this->handleUploadError($uploadResult->addErrors($canUploadResult->getErrors()),
$controller);
77 else if (!is_bool($canUploadResult) || $canUploadResult ===
false)
79 return $this->handleUploadError(
86 if (!$createResult->isSuccess())
88 return $this->handleUploadError($uploadResult->addErrors($createResult->getErrors()),
$controller);
92 $tempFile = $createResult->getData()[
'tempFile'];
93 $uploadResult->setTempFile($tempFile);
97 if (!$uploadResult->isSuccess())
99 return $this->handleUploadError($uploadResult,
$controller);
106 return $this->handleUploadError(
112 $guid = $this->getGuidFromToken($token);
115 return $this->handleUploadError(
124 '=UPLOADED' =>
false,
130 return $this->handleUploadError(
136 $uploadResult->setTempFile($tempFile);
137 $uploadResult->setToken($token);
139 $appendResult = $tempFile->append($chunk);
140 if (!$appendResult->isSuccess())
142 return $this->handleUploadError($uploadResult->addErrors($appendResult->getErrors()),
$controller);
146 if ($uploadResult->isSuccess() && $chunk->
isLast())
148 $commitResult = $tempFile->commit(
$controller->getCommitOptions());
149 if (!$commitResult->isSuccess())
151 return $this->handleUploadError($uploadResult->addErrors($commitResult->getErrors()),
$controller);
154 $fileInfo = $this->createFileInfo($uploadResult->getToken());
155 $uploadResult->setFileInfo($fileInfo);
156 $uploadResult->setDone(
true);
159 if (!$uploadResult->isSuccess())
161 return $this->handleUploadError($uploadResult,
$controller);
165 return $uploadResult;
168 private function handleUploadError(UploadResult $uploadResult, UploaderController
$controller): UploadResult
172 if (!$uploadResult->isSuccess())
174 $tempFile = $uploadResult->getTempFile();
175 if ($tempFile !==
null && $tempFile->state !== State::DELETED)
181 return $uploadResult;
186 $guid = $tempFile->getGuid();
187 $salt = $this->getTokenSalt([$guid]);
190 return $signer->sign($guid, $salt);
193 private function getGuidFromToken(
string $token): ?string
195 $parts = explode(
'.', $token, 2);
196 if (
count($parts) !== 2)
201 [$guid, $signature] = $parts;
202 if (empty($guid) || empty($signature))
207 $salt = $this->getTokenSalt([$guid]);
208 $signer =
new Signer();
210 if (!$signer->validate($guid, $signature, $salt))
218 private function getTokenSalt(
$params = []): string
230 return md5(serialize(
251 [$bfileIds, $tempFileIds] = $this->splitIds($ids);
255 if ($fileOwnerships->count() > 0)
258 if ($controller->canView())
263 foreach ($fileOwnerships as $fileOwnership)
265 if ($fileOwnership->isOwn())
267 $loadResult = $this->loadFile($fileOwnership->getId());
271 $loadResult =
new LoadResult($fileOwnership->getId());
275 $results->add($loadResult);
280 if (
count($tempFileIds) > 0)
282 foreach ($tempFileIds as $tempFileId)
284 $loadResult = $this->loadTempFile($tempFileId);
285 $results->add($loadResult);
295 $loadResults = $this->
load(array_unique($ids));
296 foreach ($loadResults as $loadResult)
298 if ($loadResult->isSuccess() && $loadResult->getFile() !==
null)
300 $result[] = $loadResult->getFile()->jsonSerialize();
316 [$bfileIds, $tempFileIds] = $this->splitIds($ids);
319 if (
count($bfileIds) > 0)
327 foreach ($fileOwnerships as $fileOwnership)
329 $removeResult =
new RemoveResult($fileOwnership->getId());
330 if ($fileOwnership->isOwn())
339 $results->add($removeResult);
344 if (
count($tempFileIds) > 0)
346 foreach ($tempFileIds as $tempFileId)
349 $results->add($removeResult);
351 $guid = $this->getGuidFromToken($tempFileId);
377 foreach ($tempFileIds as $tempFileId)
379 if (!is_string($tempFileId) || empty($tempFileId))
385 $pendingFiles->add($pendingFile);
387 $guid = $this->getGuidFromToken($tempFileId);
409 $pendingFile->setTempFile($tempFile);
412 return $pendingFiles;
415 private function loadFile(
int $fileId):
LoadResult
423 $fileInfo = $this->createFileInfo($fileId);
436 private function loadTempFile(
string $tempFileId): LoadResult
438 $result =
new LoadResult($tempFileId);
439 $guid = $this->getGuidFromToken($tempFileId);
457 $fileInfo = $this->createFileInfo($tempFileId);
470 private function createFileInfo($fileId): ?FileInfo
476 $fileInfo->setDownloadUrl($downloadUrl);
478 $fileInfo->setViewerAttrs($this->prepareViewerAttrs($fileInfo, $downloadUrl));
480 if ($fileInfo->isImage())
483 if (
$config->shouldTreatOversizeImageAsFile())
485 $treatImageAsFile =
$config->shouldTreatImageAsFile($fileInfo);
486 $fileInfo->setTreatImageAsFile($treatImageAsFile);
489 if (!$fileInfo->shouldTreatImageAsFile())
493 $fileInfo->setPreviewUrl($previewUrl, $rectangle->getWidth(), $rectangle->getHeight());
501 private function prepareViewerAttrs(FileInfo $fileInfo,
string $downloadUrl):
array
504 'ID' => $fileInfo->getId(),
505 'CONTENT_TYPE' => $fileInfo->getContentType(),
506 'ORIGINAL_NAME' => $fileInfo->getName(),
507 'WIDTH' => $fileInfo->getWidth(),
508 'HEIGHT' => $fileInfo->getHeight(),
509 'FILE_SIZE' => $fileInfo->getSize(),
512 return ItemAttributes::buildByFileData($fileData, $downloadUrl)
513 ->setTitle($fileInfo->getName())
522 foreach ($ids as $id)
526 $fileIds[] = (int)$id;
530 $tempFileIds[] = (string)$id;
534 return [$fileIds, $tempFileIds];