'image/png', '.jpg' => 'image/jpeg', '.jpeg' => 'image/jpeg', '.gif' => 'image/gif', '.bmp' => 'image/bmp', '.pdf' => 'application/x-pdf', '.doc' => 'application/msword', '.html' => 'text/html', '.mpeg' => 'video/mpeg', '.mp4' => 'video/mp4', '.mpg' => 'video/mpeg', '.mpe' => 'video/mpeg', '.avi' => 'video/x-msvideo', '.qt' => 'video/quicktime', '.mov' => 'video/quicktime' ); $m = $mime[strtolower(strrchr($filename, '.'))]; // if(!$m) die("Not a photo or video format"); return $m?$m:"application/octet-stream"; } $path = $_GET["path"]; $pathParts = explode('/', $path); if($pathParts[0]=='a'){ $virtual_filename = $pathParts[sizeof($pathParts)-1]; $fParts = pathinfo($virtual_filename); $ext = $fParts['extension']; $filebase = $pathParts[1]; $fParts = explode('_',$filebase); $imgid = $fParts[sizeof($fParts)-1]; if(sizeof($fParts)>1)$prefix = $fParts[0]; $filename = $filebase.'.'.$ext; $format = $pathParts[2]; if(sizeof($pathParts)>5){ $options = $pathParts[3]; } }else{ $filename = $pathParts[sizeof($pathParts)-1]; $format = $pathParts[sizeof($pathParts)-2]; $options = (sizeof($pathParts)>=3)?$pathParts[sizeof($pathParts)-3]:null; $fParts = explode('.',$filename); $imgid = $fParts[0]; $ext = $fParts[1]; $fParts = explode('_',$imgid); $imgid = $fParts[sizeof($fParts)-1]; } if($ext=='flv')$format='flv'; if($ext=='mp4')$format='mp4'; if(!$imgid){ header('HTTP/1.0 404 File Not Found'); // header("Content-type: text/html"); // die("File does not exist"); } # header("Cache-Control: no-cache"); error_image("File Not Found"); } if(!$FORMATS[$format]){ header('HTTP/1.0 404 File Not Found'); //header("Content-type: text/html"); //die("Invalid format"); # header("Cache-Control: no-cache"); error_image("Invalid Request", "File Format does not exist"); } assert_number($imgid); $img = getImageInfo($imgid); if(!$img){ header("HTTP/1.0 404 File Not Found"); header("Expires: ". gmdate("D, d M Y H:i:s", time() + 3600*4) . " GMT"); #header("Cache-Control: no-cache"); error_image("File Not Found", "Removed or never existed"); } if($img['deleted']>0){ header("HTTP/1.0 404 File Not Found"); //header("Content-type: text/html"); //die("Could not serve file"); //header("Cache-Control: no-cache"); error_image("File Not Found", "This image has recently been deleted."); } if($img['suspended']>=2 && strpos($_SERVER['HTTP_REFERER'], $sitename)===false){ header("HTTP/1.0 403 Forbidden"); header("Cache-Control: no-cache,no-store"); header("Expires: ". gmdate("D, d M Y H:i:s", time() ) . " GMT"); error_image("Account Suspended", "Yours? Please login soon."); } $t1 = microtime(true); $override = in_array($_SERVER["REMOTE_ADDR"], array( "80.228.31.54", "80.228.31.55", "80.228.31.56" )); $copyright=null; if($img['pref_copyright_enable'] && $img['FileType']!=1){ $min = 220; if($_ = $img['pref_copyright_minimum']){ $min = $FORMATS[$_]['width']; } if(!$override && ( $format=='img' || $FORMATS[$format]['width']>=$min)){ $copyright = $img['pref_copyright_text']; } } if(!$override && ( $img['Access_type']!='Public' || $img['Album_Access_type']!='Public' || (!$img['pref_show_originals'] && $format=='img' ) || ($copyright && $format=='img') ) ){ session_start(); loggedin(); session_write_close(); $result = selectImages('im.Id=:imid',array('imid'=>$imgid)); $row = $result['items'][0]; }else{ $row = $img; } $t2 = microtime(true); $t3 = microtime(true); if($row){ if($imgid==2218655)$logger->log(" S- Got access"); if(!preg_match('/\\.[a-z0-9]*$/i',$filename)) die("Invalid extension"); if(($copyright || !$img['pref_show_originals']) && $format=='img'){ $nocache=true; } // check if downloading of original image is allowed if(!$img['pref_show_originals'] && $format=='img' && !authorized($img['userid'])){ header("HTTP/1.0 403 Forbidden"); header("Cache-Control: no-cache"); error_image("Unauthorized","Full image download not available"); } // don't show copyright on originals for the owner if($copyright && $format=='img' && authorized($img['userid'])){ $copyright=null; } /* $rootpath = storage_folder($row['userid'],$row['albumid']); if(!file_exists($rootpath)){ header('HTTP/1.1 500 Internal Server Error'); header("Cache-Control: no-cache"); error_image("Server Error","Server temporary unavailable"); }*/ /* $spath =storage_folder($row['userid'],$row['albumid'],$format,$row['disk'], $copyright); $realfile = path($spath, $filename); */ $s = storage(); $locator = $s->getLocator($row, $format, $prefix, $copyright); $exists = $s->exists($locator); $filesize = $s->filesize($locator); //if($imgid==2550821) error_image("$exists $filesize","$locator[path]"); //$logger->log(" S- exists $exists filesize $filesize"); /* $fs = storage('fs'); if($imgid==2218655)$logger->log(" S- before"); $fsloc = $fs->getLocator($row,$format, $prefix, $copyright); if($imgid==2218655)$logger->log(" S- fsloc $fsloc[path]"); if(!$exists && $fs->exists($fsloc) && $fs->filesize($fsloc)){ if($imgid==2218655)$logger->log(" S- get from FS"); if($s->putFromFile($locator, $fsloc['path'])){ $row = getImageInfo($row['Id']); $locator = $s->getLocator($row, $format, $prefix, $copyright); //error_message("Missing file\n$fsloc[path]"); $exists = $s->exists($locator); $filesize = $s->filesize($locator); } } */ // generate alternate formats if needed if(!$exists||$options=="refresh"||$filesize==0){ if($imgid==2218655)$logger->log(" S- need to regenerate"); if($format!='movie' && $format!='flv' && $format!='mp4'){ if($copyright){ $resizetry=true; create_resized_image($row, $format, $copyright); }else{ if(needs_resize($row, $format) || $row['FileType']>0){ $resizetry=true; create_resized_image($row, $format); }else{ //$realfile = img_path($row,'img'); // serve original file $locator = $s->getLocator($row,'img'); } } }else if($ext=='flv' || $format=='flv'){ $src = $s->getLocator($row,'movie'); $dest = $s->getLocator($row,'flv'); $tmp1 = $s->getAsReadOnlyFile($src); $tmp2 = $s->generateLocalTempFilePath().'.flv'; if(create_movie_flv($tmp1, $tmp2)){ $s->putFromFile($dest, $tmp2); } }else if($ext=='mp4' || $format=='mp4'){ $src = $s->getLocator($row,'movie'); $dest = $s->getLocator($row,'mp4'); $tmp1 = $s->getAsReadOnlyFile($src); $tmp2 = $s->generateLocalTempFilePath().'.mp4'; if(create_movie_mp4($tmp1, $tmp2)){ $s->putFromFile($dest, $tmp2); } } } $exists = $s->exists($locator); $filesize = $s->filesize($locator); // TODO: more efficient // $filesize = filesize($realfile); //error_image("Temporary Error, Check back soon", "(code: $imgid,".$exists.",".$filesize."-".$resizetry.")"); if(!$exists || $filesize==0){ header("HTTP/1.0 404 File Not Found"); //header("Content-type: text/html"); //die("Could not serve file"); header("Cache-Control: no-cache"); error_image("File Not Found", "Contact support (code: $imgid,".$exists.",".($filesize==0)."-".$resizetry.")"); } $lastmod = $s->modifiedtime($locator); $cachetime = 60*60*24*365; if($row['Access_type']!='Public' || $row['Album_Access_type']!='Public' || $nocache){ header("Cache-Control: private"); // header("Cache-Control: private,no-cache,no-store"); }else{ // header("Cache-Control: public, timeout=15"); header("Expires: ". gmdate("D, d M Y H:i:s", time() + $cachetime) . " GMT"); header("Cache-Control:"); } //$lastmod = @filemtime($realfile); header("Last-Modified: ". gmdate("D, d M Y H:i:s", $lastmod) . " GMT"); header("Pragma:"); $request = getallheaders(); if (isset($request['If-Modified-Since'])) { $modifiedSince = explode(';', $request['If-Modified-Since']); $modifiedSince = strtotime($modifiedSince[0]); } else { $modefiedSince = 0; } if ($lastmod <= $modifiedSince) { header('HTTP/1.1 304 Not Modified'); header("Content-type: ".content_type($filename)); exit(); } $byte_start =0; $byte_length = null; header("Content-type: ".content_type($filename)); header('Accept-Ranges: bytes'); if(isset($request['Range'])){ $range = array(); preg_match('/^\s*(\S+?)\s*(\d*)\s*-\s*(\d*)\s*(?:,|$)/', $request['Range'], $range); if($range[2]){ $byte_start = intval($range[2]); } if($range[3]){ $byte_length = intval($range[3])-$byte_start+1; }else if($byte_start){ // only makes sense if start is specified $byte_length = $filesize-$byte_start; } if($byte_length>0 && $byte_length < $filesize){ header('HTTP/1.1 206 Partial Content'); header( 'Content-Range: bytes '.$byte_start.'-'.($byte_start+$byte_length-1).'/'.$filesize); header('Content-Length: '. $byte_length); header('X-Content-Length: '. $byte_length); }else if($byte_start+$byte_length > $filesize){ header("HTTP/1.1 416 Range Not Satisfiable"); die("Invalid range"); } } if($byte_length===null || $byte_length==$filesize){ header('Content-Length: ' . $filesize); } $t3 = microtime(true); //ob_end_flush(); //readfile($realfile); /* $file = fopen($realfile,'rb'); while(!feof($file)){ echo fread($file,32*1024); } fclose($file); */ $s->readfile($locator, $byte_start, $byte_length); //echo file_get_contents($realfile); /* // temporary help to get more files into S3 $s3 = storage('s3'); $s3loc = $s3->getLocator($row,$format, $prefix, $copyright); if($exists && $filesize>0 && !$s3->exists($s3loc)){ $s3->putFromFile($s3loc, $locator['path']); } */ }else{ header("HTTP/1.0 403 Forbidden"); header("Cache-Control: no-cache"); //header("Content-type: text/html"); error_image("Access Forbidden","Try to login if you think this is wrong."); } $t4 = microtime(true); $td = $t4-$t0; if(false && $td>30.0){ mail("logs@picturepush.com","PicturePush Debug Slow serve ".$td, "".($t1-$t0)." ".($t2-$t1)." ".($t3-$t2)." ".($t4-$t3)."\n\n URL: ".$_SERVER["REQUEST_URI"]."\n\n User id: ".$_SESSION["UserId"].", ip: ".$_SERVER["REMOTE_ADDR"]); } ?>