Photowall_WebApp/interface.php

230 lines
7.5 KiB
PHP

<?php
ini_set("display_errors", "On");
include_once "globals.php";
// 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");
// olyan szöveget ad vissza, amibe csak angol ABC betűi és számok szerepelnek (KL)
function only_alpha_numeric($input){
return preg_replace("/[^a-zA-Z0-9_]+/", "", $input);
}
// csatlakozás az adatbázishoz
function open_sql_connection()
{
return mysqli_connect(SQL_IP, SQL_USER, SQL_PASS, SQL_DB);
}
// 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:
// -2: MIME-hiba
// -3: mérethiba
// pozitív: egyedi azonosító, a feltöltés sikerült
define("MIME_ERROR", -2);
define("SIZE_ERROR", -3);
function process_uploaded_file($file_info)
{
$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_info = getimagesize($tmp_filename);
// MIME-ellenőrzés
$mime_type = $img_info["mime"];
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_info[0] < $MINIMUM_SIZE_BY_DIM && $img_info[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);
return $tmp_uid;
}
// kép publikálása
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
$incoming_filename = incoming_from_uid($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;
// 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 $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
shell_exec("mv $incoming_filename $large_filename");
}
// 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 -resize \"$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);
// beírás az adatbázisba
global $dbconn;
//echo mysqli_error($dbconn);
$img_info = getimagesize($thumb_filename);
$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"]);
$uid = md5_file($thumb_filename); // valami random...
$aspect_ratio = $img_info[0] / $img_info[1];
$query = "INSERT INTO publish_table (Author,Title,Description,Image_FileName,AspectRatio,ColorMean,Approved,UID,TS) VALUES('$author', '$title', '$desc', '$final_filename', $aspect_ratio, '$color_mean', TRUE, '$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 -1;
}
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;";
$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;
$batch = [];
// kívánt mennyiségű képinformáció lekérdezése
$query = "SELECT Image_FileName,AspectRatio,ColorMean,Author,Title,Description,UID FROM publish_table WHERE Approved 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;
$batch = [];
// az utolsó UID óta érkezett sorok kiválogatása
$query = "SELECT Image_FileName,AspectRatio,ColorMean,Author,Description,Title,UID FROM publish_table WHERE No > (SELECT No FROM publish_table WHERE UID = '$last_uid')";
$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);