|
@@ -107,13 +107,6 @@ class UploadController extends Controller
|
|
|
$type = explode('/', $media->mimetype)[0];
|
|
|
if ($type === 'text') {
|
|
|
$media->text = $filesystem->read($media->storage_path);
|
|
|
- } else if (in_array($type, ['image', 'video'])) {
|
|
|
- $url = urlFor("/$args[userCode]/$args[mediaCode]/raw");
|
|
|
- $header = "<{$url}>; rel=preload; as={$type}";
|
|
|
- if ($this->session->get('logged', false)) {
|
|
|
- $header .= '; nopush';
|
|
|
- }
|
|
|
- $response = $response->withHeader('Link', $header);
|
|
|
}
|
|
|
|
|
|
} catch (FileNotFoundException $e) {
|
|
@@ -316,6 +309,7 @@ class UploadController extends Controller
|
|
|
*/
|
|
|
protected function streamMedia(Request $request, Response $response, Filesystem $storage, $media, string $disposition = 'inline'): Response
|
|
|
{
|
|
|
+ set_time_limit(0);
|
|
|
$mime = $storage->getMimetype($media->storage_path);
|
|
|
|
|
|
if ($request->getParam('width') !== null && explode('/', $mime)[0] === 'image') {
|
|
@@ -332,60 +326,63 @@ class UploadController extends Controller
|
|
|
->withHeader('Content-Disposition', $disposition . ';filename="scaled-' . pathinfo($media->filename)['filename'] . '.png"')
|
|
|
->write($image);
|
|
|
} else {
|
|
|
-
|
|
|
$stream = new Stream($storage->readStream($media->storage_path));
|
|
|
- $start = 0;
|
|
|
- $end = $stream->getSize();
|
|
|
+
|
|
|
+ if (!in_array(explode('/', $mime)[0], ['image', 'video', 'audio']) || $disposition === 'attachment') {
|
|
|
+ return $response->withHeader('Content-Type', $mime)
|
|
|
+ ->withHeader('Content-Disposition', $disposition . '; filename="' . $media->filename . '"')
|
|
|
+ ->withHeader('Content-Length', $stream->getSize())
|
|
|
+ ->withBody($stream);
|
|
|
+ }
|
|
|
+
|
|
|
+ $end = $stream->getSize() - 1;
|
|
|
+
|
|
|
if ($request->getServerParam('HTTP_RANGE') !== null) {
|
|
|
- list(, $range) = explode('=', $_SERVER['HTTP_RANGE'], 2);
|
|
|
+ list(, $range) = explode('=', $request->getServerParam('HTTP_RANGE'), 2);
|
|
|
|
|
|
if (strpos($range, ',') !== false) {
|
|
|
return $response->withHeader('Content-Type', $mime)
|
|
|
->withHeader('Content-Disposition', $disposition . '; filename="' . $media->filename . '"')
|
|
|
- ->withHeader('Content-Length', $storage->getSize($media->storage_path))
|
|
|
+ ->withHeader('Content-Length', $stream->getSize())
|
|
|
->withHeader('Accept-Ranges', 'bytes')
|
|
|
->withHeader('Content-Range', "0,{$stream->getSize()}")
|
|
|
->withStatus(416)
|
|
|
->withBody($stream);
|
|
|
}
|
|
|
|
|
|
- if ($range == '-') {
|
|
|
- $start = $stream->getSize() - substr($range, 1);
|
|
|
+ if ($range === '-') {
|
|
|
+ $start = $stream->getSize() - (int)substr($range, 1);
|
|
|
} else {
|
|
|
$range = explode('-', $range);
|
|
|
- $start = $range[0];
|
|
|
- $end = (isset($range[1]) && is_numeric($range[1])) ? $range[1] : $end;
|
|
|
+ $start = (int)$range[0];
|
|
|
+ $end = (isset($range[1]) && is_numeric($range[1])) ? (int)$range[1] : $stream->getSize();
|
|
|
}
|
|
|
|
|
|
$end = ($end > $stream->getSize() - 1) ? $stream->getSize() - 1 : $end;
|
|
|
+ $stream->seek($start);
|
|
|
|
|
|
- if ($start > $end || $start > $stream->getSize() - 1 || $end >= $stream->getSize()) {
|
|
|
- return $response->withHeader('Content-Type', $mime)
|
|
|
- ->withHeader('Content-Disposition', $disposition . '; filename="' . $media->filename . '"')
|
|
|
- ->withHeader('Content-Length', $storage->getSize($media->storage_path))
|
|
|
- ->withHeader('Accept-Ranges', 'bytes')
|
|
|
- ->withHeader('Content-Range', "0,{$stream->getSize()}")
|
|
|
- ->withStatus(416)
|
|
|
- ->withBody($stream);
|
|
|
+ $buffer = 16384;
|
|
|
+ $readed = $start;
|
|
|
+ while ($readed < $end) {
|
|
|
+ if ($readed + $buffer > $end) {
|
|
|
+ $buffer = $end - $readed + 1;
|
|
|
+ }
|
|
|
+ echo $stream->read($buffer);
|
|
|
+ $readed += $buffer;
|
|
|
}
|
|
|
|
|
|
- $stream->seek($start);
|
|
|
+ return $response->withHeader('Content-Type', $mime)
|
|
|
+ ->withHeader('Content-Length', $end - $start + 1)
|
|
|
+ ->withHeader('Accept-Ranges', 'bytes')
|
|
|
+ ->withHeader('Content-Range', "bytes $start-$end/{$stream->getSize()}")
|
|
|
+ ->withStatus(206);
|
|
|
}
|
|
|
|
|
|
- $response->getBody()->write($stream->getContents());
|
|
|
-
|
|
|
return $response->withHeader('Content-Type', $mime)
|
|
|
- ->withHeader('Content-Disposition', $disposition . '; filename="' . $media->filename . '"')
|
|
|
->withHeader('Content-Length', $stream->getSize())
|
|
|
->withHeader('Accept-Ranges', 'bytes')
|
|
|
- ->withHeader('Content-Range', "bytes $start-$end/{$stream->getSize()}")
|
|
|
- ->withStatus(206);
|
|
|
-
|
|
|
-// return $response
|
|
|
-// ->withHeader('Content-Type', $mime)
|
|
|
-// ->withHeader('Content-Disposition', $disposition . '; filename="' . $media->filename . '"')
|
|
|
-// ->withHeader('Content-Length', $storage->getSize($media->storage_path))
|
|
|
-// ->withBody(new Stream($storage->readStream($media->storage_path)));
|
|
|
+ ->withStatus(200)
|
|
|
+ ->withBody($stream);
|
|
|
}
|
|
|
}
|
|
|
}
|