diff --git a/Controller/UploadController.php b/Controller/UploadController.php index 0ed88ce5526a476b2168260c1b3e91956627211e..3e2e89b745f4ab4a0d35fcfea8a3939cded2ccff 100644 --- a/Controller/UploadController.php +++ b/Controller/UploadController.php @@ -16,6 +16,7 @@ use Symfony\Component\Form\Extension\Csrf\CsrfProvider\CsrfProviderInterface; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; use Symfony\Component\HttpKernel\Exception\HttpException; use Symfony\Component\Routing\RouterInterface; @@ -41,7 +42,6 @@ class UploadController extends Controller */ protected $csrfProvider; - /** * */ @@ -92,10 +92,34 @@ class UploadController extends Controller { $this->validateToken($request); - $stream = $file->open('wb+'); + $range = $request->headers->get('Content-Range'); + $final = true; + + if($range) { + $matches = []; + if(!preg_match('@^bytes (\d+)-(\d+)/(\d+)$@', $range, $matches)) { + throw new BadRequestHttpException("Invalid Content-Range"); + } + $start = intval($matches[1]); + $end = intval($matches[2]); + $total = intval($matches[3]); + + $stream = $file->open('ab'); + $stream->seek($start); + + $final = $end === ($total-1); + + } else { + $stream = $file->open('wb'); + } + $stream->write($request->getContent()); $stream->close(); + if(!$final) { + return $this->createResponse(Response::HTTP_OK, 'Chunk received', ['range' => compact('start', 'end', 'total')]); + } + $this->fileManager->completed($file); return $this->createResponse( );