Fix seeking on object storage

Seeking is not needed if the $from is 0, because then the pointer is already at the correct position. Additionally another fallback is added, that if the fseek fails it just uses an fread to skip the beginning of the file until it is at the correct position. This skipping is done with a chunked fread.

Signed-off-by: Morris Jobke <hey@morrisjobke.de>
This commit is contained in:
Morris Jobke 2017-10-26 16:47:54 +02:00
parent e873b1a3d1
commit d459351ce2
No known key found for this signature in database
GPG Key ID: FE03C3A163FEDE68
1 changed files with 22 additions and 2 deletions

View File

@ -456,8 +456,28 @@ class View {
@ob_end_clean(); @ob_end_clean();
$handle = $this->fopen($path, 'rb'); $handle = $this->fopen($path, 'rb');
if ($handle) { if ($handle) {
if (fseek($handle, $from) === 0) { $chunkSize = 8192; // 8 kB chunks
$chunkSize = 8192; // 8 kB chunks $startReading = true;
if ($from !== 0 && $from !== '0' && fseek($handle, $from) !== 0) {
// forward file handle via chunked fread because fseek seem to have failed
$end = $from + 1;
while (!feof($handle) && ftell($handle) < $end) {
$len = $from - ftell($handle);
if ($len > $chunkSize) {
$len = $chunkSize;
}
$result = fread($handle, $len);
if ($result === false) {
$startReading = false;
break;
}
}
}
if ($startReading) {
$end = $to + 1; $end = $to + 1;
while (!feof($handle) && ftell($handle) < $end) { while (!feof($handle) && ftell($handle) < $end) {
$len = $end - ftell($handle); $len = $end - ftell($handle);