282 lines
9.5 KiB
PHP
282 lines
9.5 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 && exiftool -overwrite_original -all= '$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); |