|
@@ -276,8 +276,9 @@ class DocumentManager
|
|
|
|
|
|
return 'application/octet-stream';
|
|
|
}
|
|
|
- /**
|
|
|
- * This function smart streams a file to the client using HTTP headers
|
|
|
+
|
|
|
+ /**
|
|
|
+ * This function smart streams a file to the client using HTTP headers.
|
|
|
*
|
|
|
* @param string $fullFilename The full path of the file to be sent
|
|
|
* @param string $filename The name of the file as shown to the client
|
|
@@ -285,25 +286,27 @@ class DocumentManager
|
|
|
*
|
|
|
* @return bool false if file doesn't exist, true if stream succeeded
|
|
|
*/
|
|
|
- public static function smartReadFile($fullFilename, $filename, $contentType = 'application/octet-stream')
|
|
|
- {
|
|
|
+ public static function smartReadFile($fullFilename, $filename, $contentType = 'application/octet-stream')
|
|
|
+ {
|
|
|
if (!file_exists($fullFilename)) {
|
|
|
- header ("HTTP/1.1 404 Not Found");
|
|
|
+ header("HTTP/1.1 404 Not Found");
|
|
|
+
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
$size = filesize($fullFilename);
|
|
|
$time = date('r', filemtime($fullFilename));
|
|
|
-
|
|
|
+
|
|
|
$fm = @fopen($fullFilename, 'rb');
|
|
|
if (!$fm) {
|
|
|
- header ("HTTP/1.1 505 Internal server error");
|
|
|
+ header("HTTP/1.1 505 Internal server error");
|
|
|
+
|
|
|
return false;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
$begin = 0;
|
|
|
$end = $size - 1;
|
|
|
-
|
|
|
+
|
|
|
if (isset($_SERVER['HTTP_RANGE'])) {
|
|
|
if (preg_match('/bytes=\h*(\d+)-(\d*)[\D.*]?/i', $_SERVER['HTTP_RANGE'], $matches)) {
|
|
|
$begin = intval($matches[1]);
|
|
@@ -312,33 +315,34 @@ class DocumentManager
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
if (isset($_SERVER['HTTP_RANGE'])) {
|
|
|
header('HTTP/1.1 206 Partial Content');
|
|
|
} else {
|
|
|
header('HTTP/1.1 200 OK');
|
|
|
}
|
|
|
-
|
|
|
- header("Content-Type: $contentType");
|
|
|
+
|
|
|
+ header("Content-Type: $contentType");
|
|
|
header('Cache-Control: public, must-revalidate, max-age=0');
|
|
|
- header('Pragma: no-cache');
|
|
|
+ header('Pragma: no-cache');
|
|
|
header('Accept-Ranges: bytes');
|
|
|
- header('Content-Length:' . (($end - $begin) + 1));
|
|
|
+ header('Content-Length:'.(($end - $begin) + 1));
|
|
|
if (isset($_SERVER['HTTP_RANGE'])) {
|
|
|
header("Content-Range: bytes $begin-$end/$size");
|
|
|
}
|
|
|
header("Content-Disposition: inline; filename=$filename");
|
|
|
header("Content-Transfer-Encoding: binary");
|
|
|
header("Last-Modified: $time");
|
|
|
-
|
|
|
+
|
|
|
$cur = $begin;
|
|
|
fseek($fm, $begin, 0);
|
|
|
-
|
|
|
- while(!feof($fm) && $cur <= $end && (connection_status() == 0)) {
|
|
|
- print fread($fm, min(1024 * 16, ($end - $cur) + 1));
|
|
|
+
|
|
|
+ while (!feof($fm) && $cur <= $end && (connection_status() == 0)) {
|
|
|
+ echo fread($fm, min(1024 * 16, ($end - $cur) + 1));
|
|
|
$cur += 1024 * 16;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
/**
|
|
|
* This function streams a file to the client.
|
|
|
*
|
|
@@ -435,16 +439,16 @@ class DocumentManager
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
- case 'video/mp4':
|
|
|
- case 'audio/mpeg':
|
|
|
- case 'audio/mp4':
|
|
|
- case 'audio/ogg':
|
|
|
- case 'audio/webm':
|
|
|
- case 'audio/wav':
|
|
|
- case 'video/ogg':
|
|
|
- case 'video/webm':
|
|
|
- self::smartReadFile($full_file_name,$filename,$contentType);
|
|
|
- exit;
|
|
|
+ case 'video/mp4':
|
|
|
+ case 'audio/mpeg':
|
|
|
+ case 'audio/mp4':
|
|
|
+ case 'audio/ogg':
|
|
|
+ case 'audio/webm':
|
|
|
+ case 'audio/wav':
|
|
|
+ case 'video/ogg':
|
|
|
+ case 'video/webm':
|
|
|
+ self::smartReadFile($full_file_name, $filename, $contentType);
|
|
|
+ exit;
|
|
|
case 'application/vnd.dwg':
|
|
|
case 'application/vnd.dwf':
|
|
|
header('Content-type: application/octet-stream');
|