Use a single source of truth for temporary filenames
[GitHub/WoltLab/WCF.git] / wcfsetup / install / files / lib / action / FileUploadPreflightAction.class.php
1 <?php
2
3 namespace wcf\action;
4
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;
11 use wcf\http\Helper;
12 use wcf\system\request\LinkHandler;
13
14 final class FileUploadPreflightAction implements RequestHandlerInterface
15 {
16 public function handle(ServerRequestInterface $request): ResponseInterface
17 {
18 // TODO: For now we only require the filename and size to be provided.
19 $parameters = Helper::mapQueryParameters(
20 $request->getParsedBody(),
21 <<<'EOT'
22 array {
23 filename: non-empty-string,
24 fileSize: positive-int,
25 fileHash: non-empty-string,
26 }
27 EOT,
28 );
29
30 $fileTemporary = $this->createTemporaryFile($parameters);
31 $numberOfChunks = $fileTemporary->getNumberOfChunks();
32
33 $endpoints = [];
34 for ($i = 0; $i < $numberOfChunks; $i++) {
35 $endpoints[] = LinkHandler::getInstance()->getControllerLink(
36 FileUploadAction::class,
37 [
38 'identifier' => $fileTemporary->identifier,
39 'sequenceNo' => $i,
40 ]
41 );
42 }
43
44 return new JsonResponse([
45 'endpoints' => $endpoints,
46 ]);
47 }
48
49 private function createTemporaryFile(array $parameters): FileTemporary
50 {
51 $identifier = \bin2hex(\random_bytes(20));
52
53 $action = new FileTemporaryAction([], 'create', [
54 'data' => [
55 'identifier' => $identifier,
56 'time' => \TIME_NOW,
57 'filename' => $parameters['filename'],
58 'fileSize' => $parameters['fileSize'],
59 'fileHash' => $parameters['fileHash'],
60 ],
61 ]);
62
63 return $action->executeAction()['returnValues'];
64 }
65 }