5 use Laminas\Diactoros\Response\JsonResponse
;
6 use Psr\Http\Message\ResponseInterface
;
7 use Psr\Http\Message\ServerRequestInterface
;
8 use Psr\Http\Server\RequestHandlerInterface
;
9 use wcf\data\file\temporary\FileTemporary
;
10 use wcf\data\file\temporary\FileTemporaryAction
;
12 use wcf\system\request\LinkHandler
;
14 final class FileUploadPreflightAction
implements RequestHandlerInterface
16 public function handle(ServerRequestInterface
$request): ResponseInterface
18 // TODO: For now we only require the filename and size to be provided.
19 $parameters = Helper
::mapQueryParameters(
20 $request->getParsedBody(),
23 filename: non-empty-string,
24 fileSize: positive-int,
25 fileHash: non-empty-string,
30 $fileTemporary = $this->createTemporaryFile($parameters);
31 $numberOfChunks = $fileTemporary->getNumberOfChunks();
34 for ($i = 0; $i < $numberOfChunks; $i++
) {
35 $endpoints[] = LinkHandler
::getInstance()->getControllerLink(
36 FileUploadAction
::class,
38 'identifier' => $fileTemporary->identifier
,
44 return new JsonResponse([
45 'endpoints' => $endpoints,
49 private function createTemporaryFile(array $parameters): FileTemporary
51 $identifier = \bin
2hex
(\random_bytes
(20));
53 $action = new FileTemporaryAction([], 'create', [
55 'identifier' => $identifier,
57 'filename' => $parameters['filename'],
58 'fileSize' => $parameters['fileSize'],
59 'fileHash' => $parameters['fileHash'],
63 return $action->executeAction()['returnValues'];