TIMESTAMPADD(MINUTE, -10, CURRENT_TIMESTAMP) AND IP = '$ip';"; $ret = (int)mysqli_query($dbconn, $query)->fetch_assoc()["COUNT(No)"]; if ($ret === false || $ret >= UPLOAD_LIMIT_10MIN) { return LIMIT_ERROR; } $ACCEPTED_MIME_TYPES = ["image/png", "image/jpeg"]; // elfogadott MIME-típusok $MINIMUM_SIZE_BY_DIM = 2000; // minimális oldalméret $tmp_filename = $file_info["tmp_name"]; $img_sizes = getimagesize($tmp_filename); // MIME-ellenőrzés $mime_type = mime_content_type($tmp_filename); if (!in_array($mime_type, $ACCEPTED_MIME_TYPES)) { // ha nem megfelelő a fájltípus, akkor visszatérünk -1-gyel return MIME_ERROR; } // méretellenőrzés if ($img_sizes[0] < $MINIMUM_SIZE_BY_DIM && $img_sizes[1] < $MINIMUM_SIZE_BY_DIM) { return SIZE_ERROR; } // ha itt tartunk, akkor a fájl biztosan jó $tmp_uid = substr(basename($tmp_filename), 3); // "php" előtag levágása $incoming_filename = incoming_from_uid($tmp_uid); $ret = move_uploaded_file($tmp_filename, $incoming_filename); // felhasználó IP címének eltárolása a feltöltési limit betartatásához $query = "INSERT INTO server_access (IP, Image_FileName, Timestamp) VALUES('$ip', '$tmp_uid', CURRENT_TIMESTAMP);"; $res = mysqli_query($dbconn, $query); // ha valamiért sikertelen, hibával térünk vissza if ($res !== true) { return -1; } return $tmp_uid; } // kép publikálása // visszatérési értékek: // 0: OK // -1: a kép már fel van töltve // -2: hibás csoportnév define("DUPLICATE_IMAGE", -1); define("NONEXISTENT_GROUP", -2); define("THUMB_LARGEST_SIDE", 400); function publish_image($artwork_details) { $MAX_LARGE_IMAGE_FILESIZE = 2000000; // nagyméretű kép maximális mérete (MB) $MAX_LARGE_IMAGE_FILESIZE_STR = "2M"; // ...stringként $MAX_THUMB_IMAGE_FILESIZE_STR = "100k"; // bélyegkép maximális mérete $THUMB_IMAGE_LARGEST_DIM = THUMB_LARGEST_SIDE; // bélyegkép hosszabb oldalának mérete // ----------------------------- // adatbázis... global $dbconn; // felhasználótól jött adatok, ellenőrizni kell $author = mysqli_real_escape_string($dbconn, $artwork_details["author"]); $title = mysqli_real_escape_string($dbconn, $artwork_details["title"]); $desc = mysqli_real_escape_string($dbconn, $artwork_details["desc"]); $group = validate_group($artwork_details["group"]); // csoport ellenőrzése if ($group === false) { return NONEXISTENT_GROUP; } // fájlnevek meghatározása $incoming_filename = incoming_from_uid(only_alpha_numeric($artwork_details["uid"])); $final_filename = date("Y_m_d_H_i_s") . bin2hex(openssl_random_pseudo_bytes(4)) . ".jpg"; // nagyméretű kép elkészítése $large_filename = PUBLISHED_DIR . DIRECTORY_SEPARATOR . $final_filename; // konvertálás paraméterei $autocorrect = $artwork_details["autocorrect"]; $img_autocorrect = $autocorrect ? "-normalize -sharpen 5" : ""; $auto_orient = "-auto-orient"; // autómatikus elforgatás az EXIF infók alapján $strip_exifdata = "-strip"; // EXIF információk kiszedése // tömörítés, korrekció, elforgatás, EXIF tisztítás $cmd = "convert -define jpeg:extent=$MAX_LARGE_IMAGE_FILESIZE_STR $img_autocorrect $auto_orient $strip_exifdata $incoming_filename $large_filename"; shell_exec($cmd); unlink($incoming_filename); // törlés az incoming-ból // bélyegkép elkészítése $thumb_filename = THUMBNAIL_DIR . DIRECTORY_SEPARATOR . $final_filename; $cmd = "convert -define jpeg:extent=$MAX_THUMB_IMAGE_FILESIZE_STR -thumbnail \"$THUMB_IMAGE_LARGEST_DIM>\" $large_filename $thumb_filename"; shell_exec($cmd); // átlagszín kiszámítása $cmd = "convert $thumb_filename -resize 1x1\! -format \"rgb(%[fx:int(255*r+.5)],%[fx:int(255*g+.5)],%[fx:int(255*b+.5)])\" info:-"; $color_mean = shell_exec($cmd); //echo mysqli_error($dbconn); $img_sizes = getimagesize($thumb_filename); $uid = md5_file($thumb_filename); // valami random... $aspect_ratio = $img_sizes[0] / $img_sizes[1]; $query = "INSERT INTO publish_table (Author,AuthorGroup,Title,Description,Image_FileName,AspectRatio,ColorMean,Approved,Confirmed,UID,TS) VALUES('$author', '$group', '$title', '$desc', '$final_filename', $aspect_ratio, '$color_mean', 1, 0, '$uid', CURRENT_TIMESTAMP);"; $res = mysqli_query($dbconn, $query); // megnézzük, hogy volt-e már ilyen kép feltöltve if ($res === false) { unlink($large_filename); unlink($thumb_filename); return DUPLICATE_IMAGE; } return 0; } /* $accented_chars = explode(",","ç,æ,œ,á,é,í,ó,ú,à,è,ì,ò,ù,ä,ë,ï,ö,ü,ÿ,â,ê,î,ô,û,å,e,i,ø,u"); $accented_alternatives = explode(",","c,ae,oe,a,e,i,o,u,a,e,i,o,u,a,e,i,o,u,y,a,e,i,o,u,a,e,i,o,u"); $title = $artwork_details["title"]; $title_conforming = str_replace(" ", "_", $title); $title_conforming = strtolower($title_conforming); $title_conforming = str_replace($accented_chars, $accented_alternatives, $title_conforming);*/ // általános információk lekérése function get_general_info() { global $dbconn; $info = []; // összes kép számának lekérdezése $query = "SELECT COUNT(No) FROM publish_table WHERE Approved=1;"; $ret = (int)mysqli_query($dbconn, $query)->fetch_assoc()["COUNT(No)"]; $info["total_artwork_count"] = $ret; // bélyegképek hosszabb oldalának nagysága $info["thumb_largest_side"] = THUMB_LARGEST_SIDE; return $info; } // egy adagnyi képinformáció szolgáltalása function get_batch($offset, $n) { global $dbconn; // felhasználótól jött paraméterek, ellenőrizni kell $offset = intval($offset); $n = intval($n); $batch = []; // kívánt mennyiségű képinformáció lekérdezése $query = "SELECT Image_FileName,AspectRatio,ColorMean,Author,AuthorGroup,Title,Description,UID FROM publish_table WHERE Approved=1 ORDER BY No DESC Limit $n OFFSET $offset;"; $ret = mysqli_query($dbconn, $query); while (($row = $ret->fetch_assoc()) != NULL) { $batch[] = $row; } return $batch; } // az utolsó ismert UID-óta keletkezett sorokat kéri le function get_update_batch($last_uid) { global $dbconn; // felhasználótól jött paraméter, ellenőrizni kell $last_uid = mysqli_real_escape_string($dbconn, $last_uid); $batch = []; // az utolsó UID óta érkezett sorok kiválogatása $query = "SELECT Image_FileName,AspectRatio,ColorMean,Author,AuthorGroup,Description,Title,UID FROM publish_table WHERE No > IFNULL((SELECT No FROM publish_table WHERE UID = '$last_uid'), -1) AND Approved=1;"; $ret = mysqli_query($dbconn, $query); while (($row = $ret->fetch_assoc()) != NULL) { $batch[] = $row; } return $batch; } // ------------------------------------ if (!isset($_POST["action"])) { exit(0); } $action = only_alpha_numeric($_POST["action"]); $ret = -1; // parancs kiválasztása switch ($action) { case "upload": // fájl feltöltése if (isset($_FILES["image"]) && $_FILES["image"]["error"] === 0) { $ret = process_uploaded_file($_FILES["image"]); } break; case "publish": // kép publikálása if (isset($_POST["details"])) { $details = json_decode($_POST["details"], true); $ret = publish_image($details); } break; case "general_info": // általános információ lekérése $ret = json_encode(get_general_info()); break; case "batch": // egy adagnyi kép lekérése if (isset($_POST["offset"]) && isset($_POST["n"])) { $ret = json_encode(get_batch($_POST["offset"], $_POST["n"])); } break; case "update": // új képek betöltése if (isset($_POST["last_uid"])) { $ret = json_encode(get_update_batch(json_decode($_POST["last_uid"]))); } break; } // válasz küldése echo $ret; mysqli_close($dbconn);