5 use Laminas\Diactoros\Response\JsonResponse
;
6 use Psr\Http\Message\ResponseInterface
;
7 use Psr\Http\Message\ServerRequestInterface
;
8 use Psr\Http\Server\RequestHandlerInterface
;
10 use wcf\system\request\LinkHandler
;
13 final class FileUploadPreflightAction
implements RequestHandlerInterface
15 public function handle(ServerRequestInterface
$request): ResponseInterface
17 // TODO: For now we only require the filename and size to be provided.
18 $parameters = Helper
::mapQueryParameters(
19 $request->getParsedBody(),
22 filename: non-empty-string,
23 filesize: positive-int,
28 // TODO: The chunk calculation shouldn’t be based on a fixed number.
29 $chunkSize = 2_000_000
;
30 $chunks = (int)\
ceil($parameters['filesize'] / $chunkSize);
32 $identifier = $this->createTemporaryFile($parameters);
35 for ($i = 0; $i < $chunks; $i++
) {
36 $endpoints[] = LinkHandler
::getInstance()->getControllerLink(
37 FileUploadAction
::class,
39 'identifier' => $identifier,
45 return new JsonResponse([
46 'endpoints' => $endpoints,
50 private function createTemporaryFile(array $parameters): string
52 $identifier = \bin
2hex
(\random_bytes
(20));
54 $sql = "INSERT INTO wcf1_file_temporary
55 (identifier, time, filename, filesize)
57 $statement = WCF
::getDB()->prepare($sql);
61 $parameters['filename'],
62 $parameters['filesize'],