<html><!-- sample image search engine, part of the libpuzzle package --> <head> </head> <body> <h1>Similar images finder using <a href="http://libpuzzle.pureftpd.org">libpuzzle</a></h1> <?php error_reporting(E_ALL); require_once 'config.inc.php'; require_once 'similar.inc.php'; function display_form() { echo '<form action="' . htmlspecialchars($_SERVER['REQUEST_URI']) . '" ' . 'method="POST">' . "\n"; echo 'Enter an image URL (http only):' . "\n"; echo '<input type="text" size="100" value="" autocomplete="off" name="url" />' . "\n"; echo '<input type="submit" />'; echo '</form>' . "\n"; } function display_error($err) { echo '<div id="err"><strong>' . htmlspecialchars($err) . '</strong></div>' . "\n"; } function display_loading() { echo '<div id="loading">Loading...</div>' . "\n"; @ob_flush(); flush(); } function display_loaded() { echo '<div id="loaded">Loaded.</div>' . "\n"; @ob_flush(); flush(); } function display_signature_ok() { echo '<div id="sig-ok">Signature computed.</div>' . "\n"; @ob_flush(); flush(); } function remove_tmpfile($file) { @unlink($file); } function get_client_info() { return @$_SERVER['REMOTE_ADDR'] . '/' . time(); } function display_similar_pictures($urls) { echo '<div id="images">' . "\n"; foreach ($urls as $url) { echo '<a href="' . htmlentities($url) . '" ' . 'onclick="window.open(this.href); return false;">'; echo ' <img src="' . htmlentities($url) . '" alt="" />'; echo '</a>' . "\n"; } echo '</div>' . "\n"; } function record_url($url, &$md5, &$cvec) { if (function_exists('sys_get_temp_dir')) { $tmpdir = sys_get_temp_dir(); } else { $tmpdir = '/tmp'; } $dfn = tempnam($tmpdir, 'similar-' . md5(uniqid(mt_rand(), TRUE))); register_shutdown_function('remove_tmpfile', $dfn); if (($dfp = fopen($dfn, 'w')) == FALSE) { display_form(); display_error('Unable to create the temporary file'); return FALSE; } if (($fp = fopen($url, 'r')) == FALSE) { display_form(); display_error('Unable to open: [' . $url . ']'); return FALSE; } $f = fread($fp, 4096); $written = strlen($f); if (empty($f)) { display_form(); display_error('Unable to load: [' . $url . ']'); return FALSE; } fwrite($dfp, $f); $infos = @getimagesize($dfn); if (empty($infos) || ($infos[2] !== IMAGETYPE_GIF && $infos[2] !== IMAGETYPE_JPEG && $infos[2] !== IMAGETYPE_PNG) || $infos[0] < 50 || $infos[1] < 50) { fclose($dfp); display_form(); display_error('Unsupported image format'); return FALSE; } fseek($dfp, strlen($f)); while (!feof($fp)) { $max = MAX_IMAGE_SIZE - $written; if ($max > 65536) { $max = 65536; } $t = fread($fp, $max); fwrite($dfp, $t); $written += strlen($t); if ($written > MAX_IMAGE_SIZE) { fclose($dfp); display_form(); display_error('File too large'); return FALSE; } } unset($t); fclose($dfp); display_loaded(); $md5 = @md5_file($dfn); if (empty($md5)) { display_form(); display_error('Unable to get the MD5 of the file'); return FALSE; } $cvec = puzzle_fill_cvec_from_file($dfn); if (empty($cvec)) { display_form(); display_error('Unable to compute image signature'); return FALSE; } display_signature_ok(); save_signature($url, get_client_info(), $md5, $cvec); return TRUE; } $url = trim(@$_POST['url']); if (empty($url)) { display_form(); exit(0); } if (strlen($url) > MAX_URL_SIZE || preg_match('�^http://([a-z0-9-]+[.])+[a-z]{2,}/.�i', $url) <= 0) { display_form(); display_error('Invalid URL, must be http://...'); exit(1); } display_loading(); $md5 = FALSE; $cvec = FALSE; if (record_url($url, $md5, $cvec) !== TRUE) { exit(1); } $urls = find_similar_pictures($md5, $cvec); unset($cvec); display_form(); display_similar_pictures($urls); ?> </body> </html>