Photowall_WebApp/interface.php
Kováts Levente c9d5aa4ae2 javítások (forgatás)
TESZTVERZIÓ leszedése a jóváhagyó oldalról
véletlenűl commit-olt fájlok eltávolítása
legelső kép esetében get_update_batch query javítása
2021-01-25 15:54:08 +01:00

272 lines
9.1 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;
// 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);