251 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			251 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?
 | 
						|
//
 | 
						|
//  Copyright (c) 2013 Mr. Gecko's Media (James Coleman). http://mrgeckosmedia.com/
 | 
						|
//
 | 
						|
//  Permission to use, copy, modify, and/or distribute this software for any purpose
 | 
						|
//  with or without fee is hereby granted, provided that the above copyright notice
 | 
						|
//  and this permission notice appear in all copies.
 | 
						|
//
 | 
						|
//  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
 | 
						|
//  REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
 | 
						|
//  FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT,
 | 
						|
//  OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
 | 
						|
//  DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
 | 
						|
//  ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 | 
						|
//
 | 
						|
if ($_MGM['path'][1]=="complete") {
 | 
						|
	if ($_MGM['path'][2]=="process") {
 | 
						|
		$file = (isset($_REQUEST['file']) ? $_REQUEST['file'] : "");
 | 
						|
		$filename = pathinfo($file, PATHINFO_FILENAME);
 | 
						|
		$extension = strtolower(pathinfo($file, PATHINFO_EXTENSION));
 | 
						|
		echo "Processing ".basename($file)."<br />\n";
 | 
						|
		if (!file_exists($file)) {
 | 
						|
			echo "Error: <span style=\"color: #ff0000;\">File does not exist.</span>";
 | 
						|
			exit();
 | 
						|
		}
 | 
						|
		$allowedExtensions = array("png", "jpg", "jpeg", "gif", "tif", "tiff", "bmp");
 | 
						|
		if (!in_array($extension, $allowedExtensions)) {
 | 
						|
			echo "Error: <span style=\"color: #ff0000;\">Extension is not allowed.</span>";
 | 
						|
			unlink($file);
 | 
						|
			exit();
 | 
						|
		}
 | 
						|
		
 | 
						|
		$fileSize = filesize($file);
 | 
						|
		echo "Size: ".$fileSize."<br />\n";
 | 
						|
		
 | 
						|
		list($width, $height, $type, $attr) = getimagesize($file);
 | 
						|
		if (!isset($width) || !isset($height)) {
 | 
						|
			echo "Error: <span style=\"color: #ff0000;\">Cannot read image.</span>";
 | 
						|
			unlink($file);
 | 
						|
			exit();
 | 
						|
		}
 | 
						|
		echo "Width: ".$width." Height: ".$height."<br />\n";
 | 
						|
		
 | 
						|
		$hash = md5_file($file);
 | 
						|
		if ($hash==NULL) {
 | 
						|
			echo "Error: <span style=\"color: #ff0000;\">Unable to hash image.</span>";
 | 
						|
			unlink($file);
 | 
						|
			exit();
 | 
						|
		}
 | 
						|
		echo "Hash: ".$hash."<br />\n";
 | 
						|
		
 | 
						|
		$newFile = "./data/".$hash.".".$extension;
 | 
						|
		if (file_exists($newFile)) {
 | 
						|
			echo "Error: <span style=\"color: #ff0000;\">File already uploaded.</span>";
 | 
						|
			unlink($file);
 | 
						|
			exit();
 | 
						|
		}
 | 
						|
		
 | 
						|
		$ocr = "";
 | 
						|
		if (file_exists("./ocr")) {
 | 
						|
			$descriptorspec = array(
 | 
						|
				0 => array("pipe", "r"),
 | 
						|
				1 => array("pipe", "w"),
 | 
						|
				2 => array("pipe", "w")
 | 
						|
			);
 | 
						|
			$process = proc_open("./ocr \"".$file."\"", $descriptorspec, $pipes, getcwd());
 | 
						|
		
 | 
						|
			fclose($pipes[0]);
 | 
						|
			while (is_resource($process)) {
 | 
						|
				$read = $pipes;
 | 
						|
				$write = null;
 | 
						|
				$except = null;
 | 
						|
				$result = stream_select($read, $write, $except, 30);
 | 
						|
			
 | 
						|
				if ($result==0) {
 | 
						|
					fclose($pipes[1]);
 | 
						|
					fclose($pipes[2]);
 | 
						|
					proc_terminate($process,9);
 | 
						|
					break;
 | 
						|
				} else if ($result>0) {
 | 
						|
					$line = fread($pipes[1], 8192);
 | 
						|
					if (strlen($line)==0) {
 | 
						|
						fclose($pipes[1]);
 | 
						|
						fclose($pipes[2]);
 | 
						|
						proc_close($process);
 | 
						|
						break;
 | 
						|
					}
 | 
						|
					$ocr .= $line;
 | 
						|
				}
 | 
						|
			}	
 | 
						|
			echo "OCR: ".$ocr."<br />\n";
 | 
						|
		}
 | 
						|
		
 | 
						|
		$tags = array();
 | 
						|
		$external_data = "";
 | 
						|
		
 | 
						|
		$plugins = glob("./external_data_plugins/*.php");
 | 
						|
		for ($i=0; $i<count($plugins); $i++) {
 | 
						|
			require($plugins[$i]);
 | 
						|
		}
 | 
						|
		
 | 
						|
		echo "External Data: ".$external_data."<br />\n";
 | 
						|
		
 | 
						|
		$thumbFile = "./thumbs/".$hash.".".$extension;
 | 
						|
		$target = 150;
 | 
						|
		$newWidth = $width;
 | 
						|
		$newHeight = $height;
 | 
						|
		if ($width>$target || $height>$target) {
 | 
						|
			$widthFactor = $target/$width;
 | 
						|
			$heightFactor = $target/$height;
 | 
						|
			$scaleFactor = 1;
 | 
						|
	
 | 
						|
			if ($widthFactor<$heightFactor)
 | 
						|
				$scaleFactor = $widthFactor;
 | 
						|
			else
 | 
						|
				$scaleFactor = $heightFactor;
 | 
						|
	
 | 
						|
			$newWidth = round($width*$scaleFactor);
 | 
						|
			$newHeight = round($height*$scaleFactor);
 | 
						|
		}
 | 
						|
		if ($type==IMAGETYPE_GIF) {
 | 
						|
			$tmp = "./thumbs/coalesce".rand().".gif";
 | 
						|
			system($_MGM['imagemagick']."convert \"".$file."\" -coalesce \"".$tmp."\"");
 | 
						|
			system($_MGM['imagemagick']."convert -size ".$width."x".$height." \"".$tmp."\" -resize ".$newWidth."x".$newHeight." \"".$thumbFile."\"");
 | 
						|
			unlink($tmp);
 | 
						|
		} else {
 | 
						|
			system($_MGM['imagemagick']."convert -size ".$width."x".$height." \"".$file."\" -resize ".$newWidth."x".$newHeight." \"".$thumbFile."\"");
 | 
						|
		}
 | 
						|
		chmod($thumbFile, 0666);
 | 
						|
		echo "Saved thumbnail.<br />\n";
 | 
						|
		
 | 
						|
		rename($file, $newFile);
 | 
						|
		echo "Moved Original.<br />\n";
 | 
						|
		
 | 
						|
		databaseQuery("INSERT INTO images (user_id,hash,extension,name,file_size,width,height,thumb_file_size,thumb_width,thumb_height,tags,external_data,ocr,time) VALUES (%s,%s,%s,%s,%d,%d,%d,%d,%d,%d,%s,%s,%s,%d)", $_MGM['user']['docid'], $hash, $extension, $filename, $fileSize, $width, $height, filesize($thumbFile), $newWidth, $newHeight, implode(" ", $tags), $external_data, $ocr, filemtime($newFile));
 | 
						|
		echo "Complete.<br />\n";
 | 
						|
		exit();
 | 
						|
	}
 | 
						|
	$files = glob("./load/*");
 | 
						|
	require_once("header.php");
 | 
						|
	?>
 | 
						|
	Processing...<br />
 | 
						|
	<div id="result"></div>
 | 
						|
	<script type="text/javascript">
 | 
						|
	var files = new Array(<?
 | 
						|
		$array = "";
 | 
						|
		for ($i=0; $i<count($files); $i++) {
 | 
						|
			//if (in_array(pathinfo($files[$i], PATHINFO_EXTENSION), $allowedExtensions)) {
 | 
						|
			if ($array!="")
 | 
						|
				$array .= ",";
 | 
						|
			$array .= "\"".str_replace("\"", "\\\"", $files[$i])."\"";
 | 
						|
		}
 | 
						|
		echo $array;
 | 
						|
	?>);
 | 
						|
	var i=0;
 | 
						|
	function processFiles() {
 | 
						|
		if (i<files.length) {
 | 
						|
			var status = document.createElement("p");
 | 
						|
			status.innerHTML = "Processing "+(i+1)+" of "+files.length+" files.";
 | 
						|
			document.getElementById("result").appendChild(status);
 | 
						|
			
 | 
						|
			var request = new XMLHttpRequest;
 | 
						|
			request.onreadystatechange = function() {
 | 
						|
				if (request.readyState==4) {
 | 
						|
					var status = document.createElement("p");
 | 
						|
					status.innerHTML = request.responseText;
 | 
						|
					document.getElementById("result").appendChild(status);
 | 
						|
					processFiles();
 | 
						|
				}
 | 
						|
			}
 | 
						|
			request.open("post", "<?=generateURL("upload/complete/process")?>", true);
 | 
						|
			request.setRequestHeader("Cache-Control", "no-cache");
 | 
						|
			request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
 | 
						|
			request.send("file="+encodeURIComponent(files[i]));
 | 
						|
			i++;
 | 
						|
		} else {
 | 
						|
			var completed = document.createElement("p");
 | 
						|
			completed.innerHTML = "Processing Completed.";
 | 
						|
			document.getElementById("result").appendChild(completed);
 | 
						|
		}
 | 
						|
	}
 | 
						|
	
 | 
						|
	processFiles();
 | 
						|
	</script>
 | 
						|
	<?
 | 
						|
	require_once("footer.php");
 | 
						|
	exit();
 | 
						|
}
 | 
						|
 | 
						|
$file = $_SERVER['HTTP_X_FILENAME'];
 | 
						|
if (isset($file)) {
 | 
						|
	$input = fopen("php://input", "r");
 | 
						|
	if (file_exists("./load/".$file))
 | 
						|
		unlink("./load/".$file);
 | 
						|
	$output = fopen("./load/".$file, "w");
 | 
						|
	
 | 
						|
	while ($data = fread($input, 1024))
 | 
						|
		fwrite($output, $data);
 | 
						|
	
 | 
						|
	fclose($output);
 | 
						|
	fclose($input);
 | 
						|
	echo "uploaded";
 | 
						|
	exit();
 | 
						|
}
 | 
						|
require_once("header.php");
 | 
						|
?>
 | 
						|
<script type="text/javascript">
 | 
						|
function upload() {
 | 
						|
	var files = document.getElementById("files").files;
 | 
						|
	document.getElementById("files").setAttribute("disabled", "true");
 | 
						|
	document.getElementById("uploadButton").setAttribute("disabled", "true");
 | 
						|
	var i=0;
 | 
						|
	function setupFile() {
 | 
						|
		if (i<files.length) {
 | 
						|
			document.getElementById("progress").innerHTML = "Uploading "+(i+1)+" of "+files.length+" files.";
 | 
						|
			var file = files[i];
 | 
						|
			if (file.name==undefined) {
 | 
						|
				document.getElementById("progress").innerHTML = "Error: Browser unsupported.";
 | 
						|
				return;
 | 
						|
			}
 | 
						|
			var request = new XMLHttpRequest;
 | 
						|
			request.onreadystatechange = function() {
 | 
						|
				if (request.readyState==4)
 | 
						|
					setupFile();
 | 
						|
			}
 | 
						|
			request.open("post", "<?=generateURL("upload")?>", true);
 | 
						|
			request.setRequestHeader("Cache-Control", "no-cache");
 | 
						|
			request.setRequestHeader("X-FILENAME", file.name);
 | 
						|
			request.setRequestHeader("Content-Type", "multipart/form-data");
 | 
						|
			request.send(file);
 | 
						|
			i++;
 | 
						|
		} else {
 | 
						|
			document.getElementById("progress").innerHTML = "Upload Complete.";
 | 
						|
			document.getElementById("files").removeAttribute("disabled");
 | 
						|
			document.getElementById("uploadButton").removeAttribute("disabled");
 | 
						|
			document.getElementById("files").form.reset();
 | 
						|
			window.location = "<?=generateURL("upload/complete")?>";
 | 
						|
		}
 | 
						|
	}
 | 
						|
	setupFile();
 | 
						|
}
 | 
						|
</script>
 | 
						|
<form>
 | 
						|
<input type="file" multiple="true" id="files" />
 | 
						|
<input type="button" id="uploadButton" onclick="upload()" value="Upload" class="btn" />
 | 
						|
</form>
 | 
						|
<div id="progress"></div>
 | 
						|
<?
 | 
						|
require_once("footer.php");
 | 
						|
exit();
 | 
						|
?>
 |