282 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			282 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
include_once "utils.php";
 | 
						|
 | 
						|
// feltöltési limit 10 percen belül
 | 
						|
define("UPLOAD_LIMIT_10MIN", 10);
 | 
						|
 | 
						|
// könyvtárak
 | 
						|
define("ARTWORKS_DIR", "ARTWORKS");
 | 
						|
define("INCOMING_DIR", ARTWORKS_DIR . DIRECTORY_SEPARATOR . "incoming");
 | 
						|
define("PUBLISHED_DIR", ARTWORKS_DIR . DIRECTORY_SEPARATOR . "published");
 | 
						|
define("THUMBNAIL_DIR", ARTWORKS_DIR . DIRECTORY_SEPARATOR . "thumbnails");
 | 
						|
 | 
						|
// Globális SQL-kapcsolat
 | 
						|
$dbconn = open_sql_connection();
 | 
						|
 | 
						|
// incoming fájl elérési útvonala UID-ből
 | 
						|
function incoming_from_uid($uid)
 | 
						|
{
 | 
						|
    return INCOMING_DIR . DIRECTORY_SEPARATOR . $uid;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * feltöltött fájl feldolgozása
 | 
						|
 * RET:
 | 
						|
 *  -1: ismeretlen hiba
 | 
						|
 *  -2: MIME-hiba
 | 
						|
 *  -3: mérethiba
 | 
						|
 *  -4: elérte a feltöltési limitet
 | 
						|
 * string: egyedi azonosító, a feltöltés sikerült
 | 
						|
 */
 | 
						|
 | 
						|
define("MIME_ERROR", -2);
 | 
						|
define("SIZE_ERROR", -3);
 | 
						|
define("LIMIT_ERROR", -4);
 | 
						|
 | 
						|
function process_uploaded_file($file_info)
 | 
						|
{
 | 
						|
    // feltöltési limit ellenőrzése
 | 
						|
    global $dbconn;
 | 
						|
    $ip = mysqli_real_escape_string($dbconn, get_client_ip()); // escape, biztos ami biztos
 | 
						|
    $query = "SELECT COUNT(No) FROM server_access WHERE Timestamp > 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;
 | 
						|
 | 
						|
    // korrekciós parancs
 | 
						|
    $autocorrect = $artwork_details["autocorrect"];
 | 
						|
    $img_autocorrect = $autocorrect ? "-normalize -sharpen 5" : "";
 | 
						|
    $strip_exifdata = "-strip";
 | 
						|
 | 
						|
    // ha a fájl nagyobb, mint 2MB, akkor visszatömörítjük
 | 
						|
    $filesize = filesize($incoming_filename);
 | 
						|
    if ($filesize > $MAX_LARGE_IMAGE_FILESIZE) {
 | 
						|
        $cmd = "convert -define jpeg:extent=$MAX_LARGE_IMAGE_FILESIZE_STR $img_autocorrect $strip_exifdata $incoming_filename $large_filename";
 | 
						|
        shell_exec($cmd);
 | 
						|
        unlink($incoming_filename); // törlés az incoming-ból
 | 
						|
    } else { //...ha nem volt túl nagy a fájl
 | 
						|
        if ($autocorrect) {
 | 
						|
            $cmd = "convert $img_autocorrect $strip_exifdata $incoming_filename $large_filename";
 | 
						|
            shell_exec($cmd);
 | 
						|
            unlink($incoming_filename); // törlés az incoming-ból
 | 
						|
        } else {
 | 
						|
            shell_exec("mv $incoming_filename $large_filename");
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    // bélyegkép elkészítése
 | 
						|
    $thumb_filename = THUMBNAIL_DIR . DIRECTORY_SEPARATOR . $final_filename;
 | 
						|
    $cmd = "convert $strip_exifdata -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 > (SELECT No FROM publish_table WHERE UID = '$last_uid') 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); |