122 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			122 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| namespace Zotlabs\Lib;
 | |
| 
 | |
| class Img_filesize {
 | |
| 
 | |
| 	private $url;
 | |
| 
 | |
| 	function __construct($url) {
 | |
| 		$this->url = $url;
 | |
| 	}
 | |
| 
 | |
| 	function getSize() {
 | |
| 		$size = null;
 | |
| 
 | |
| 		if(stripos($this->url,z_root() . '/photo') !== false) {
 | |
| 			$size = self::getLocalFileSize($this->url);
 | |
| 		}
 | |
| 		if(! $size) {
 | |
| 			$size = getRemoteFileSize($this->url);
 | |
| 		}
 | |
| 
 | |
| 		return $size;
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 	static function getLocalFileSize($url) {
 | |
| 	
 | |
| 		$fname = basename($url);
 | |
| 		$resolution = 0;
 | |
| 	
 | |
| 		if(strpos($fname,'.') !== false)
 | |
| 			$fname = substr($fname,0,strpos($fname,'.'));
 | |
| 	
 | |
| 		if(substr($fname,-2,1) == '-') {
 | |
| 			$resolution = intval(substr($fname,-1,1));
 | |
| 			$fname = substr($fname,0,-2);
 | |
| 		}
 | |
| 			
 | |
| 		$r = q("SELECT filesize FROM photo WHERE resource_id = '%s' AND imgscale = %d LIMIT 1",
 | |
| 			dbesc($fname),
 | |
| 			intval($resolution)
 | |
| 		);
 | |
| 		if($r) {
 | |
| 			return $r[0]['filesize'];
 | |
| 		}
 | |
| 		return null;
 | |
| 	}
 | |
| 
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Try to determine the size of a remote file by making an HTTP request for
 | |
|  * a byte range, or look for the content-length header in the response.
 | |
|  * The function aborts the transfer as soon as the size is found, or if no
 | |
|  * length headers are returned, it aborts the transfer.
 | |
|  *
 | |
|  * @return int|null null if size could not be determined, or length of content
 | |
|  */
 | |
| function getRemoteFileSize($url)
 | |
| {
 | |
|     $ch = curl_init($url);
 | |
| 
 | |
|     $headers = array(
 | |
|         'Range: bytes=0-1',
 | |
|         'Connection: close',
 | |
|     );
 | |
| 
 | |
|     $in_headers = true;
 | |
|     $size       = null;
 | |
| 
 | |
|     curl_setopt($ch, CURLOPT_HEADER, 1);
 | |
|     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 | |
|     curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2450.0 Iron/46.0.2450.0');
 | |
|     curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
 | |
|     curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
 | |
|     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
 | |
|     curl_setopt($ch, CURLOPT_VERBOSE, 0); // set to 1 to debug
 | |
|     curl_setopt($ch, CURLOPT_STDERR, fopen('php://output', 'r'));
 | |
| 
 | |
|     curl_setopt($ch, CURLOPT_HEADERFUNCTION, function($curl, $line) use (&$in_headers, &$size) {
 | |
|         $length = strlen($line);
 | |
| 
 | |
|         if (trim($line) == '') {
 | |
|             $in_headers = false;
 | |
|         }
 | |
| 
 | |
|         list($header, $content) = explode(':', $line, 2);
 | |
|         $header = strtolower(trim($header));
 | |
| 
 | |
|         if ($header == 'content-range') {
 | |
|             // found a content-range header
 | |
|             list($rng, $s) = explode('/', $content, 2);
 | |
|             $size = (int)$s;
 | |
|             return 0; // aborts transfer
 | |
|         } else if ($header == 'content-length' && 206 != curl_getinfo($curl, CURLINFO_HTTP_CODE)) {
 | |
|             // found content-length header and this is not a 206 Partial Content response (range response)
 | |
|             $size = (int)$content;
 | |
|             return 0;
 | |
|         } else {
 | |
|             // continue
 | |
|             return $length;
 | |
|         }
 | |
|     });
 | |
| 
 | |
|     curl_setopt($ch, CURLOPT_WRITEFUNCTION, function($curl, $data) use ($in_headers) {
 | |
|         if (!$in_headers) {
 | |
|             // shouldn't be here unless we couldn't determine file size
 | |
|             // abort transfer
 | |
|             return 0;
 | |
|         }
 | |
| 
 | |
|         // write function is also called when reading headers
 | |
|         return strlen($data);
 | |
|     });
 | |
| 
 | |
|     curl_exec($ch);
 | |
|     curl_getinfo($ch);
 | |
| 	curl_close($ch);
 | |
| 
 | |
|     return $size;
 | |
| } |