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(
         );