386 lines
9.4 KiB
PHP
Executable File
386 lines
9.4 KiB
PHP
Executable File
<?php
|
|
|
|
/**
|
|
* @name Upload Module
|
|
* @author Philipp Maurer
|
|
* @author Tobias Reich
|
|
* @copyright 2014 by Philipp Maurer, Tobias Reich
|
|
*/
|
|
|
|
if (!defined('LYCHEE')) exit('Error: Direct access is not allowed!');
|
|
|
|
function upload($files, $albumID) {
|
|
|
|
global $database;
|
|
|
|
switch($albumID) {
|
|
// s for public (share)
|
|
case 's':
|
|
$public = 1;
|
|
$star = 0;
|
|
$albumID = 0;
|
|
break;
|
|
// f for starred (fav)
|
|
case 'f':
|
|
$star = 1;
|
|
$public = 0;
|
|
$albumID = 0;
|
|
break;
|
|
default:
|
|
$star = 0;
|
|
$public = 0;
|
|
}
|
|
|
|
foreach ($files as $file) {
|
|
|
|
$id = str_replace('.', '', microtime(true));
|
|
while(strlen($id)<14) $id .= 0;
|
|
|
|
$tmp_name = $file["tmp_name"];
|
|
|
|
$type = getimagesize($tmp_name);
|
|
if (($type[2]!=1)&&($type[2]!=2)&&($type[2]!=3)) return false;
|
|
$data = array_reverse(explode('.', $file["name"]));
|
|
$data = $data[0];
|
|
|
|
$photo_name = md5($id) . ".$data";
|
|
|
|
// Import if not uploaded via web
|
|
if (!is_uploaded_file($tmp_name)) {
|
|
if (copy($tmp_name, "../uploads/big/" . $photo_name)) {
|
|
unlink($tmp_name);
|
|
$import_name = $tmp_name;
|
|
}
|
|
} else {
|
|
move_uploaded_file($tmp_name, "../uploads/big/" . $photo_name);
|
|
$import_name = "";
|
|
}
|
|
|
|
// Read infos
|
|
$info = getInfo($photo_name);
|
|
|
|
// Set orientation based on EXIF data
|
|
if (isset($info['orientation'])&&isset($info['width'])&&isset($info['height'])) {
|
|
|
|
if ($info['orientation']==3||$info['orientation']==6||$info['orientation']==8) {
|
|
|
|
$newWidth = $info['width'];
|
|
$newHeight = $info['height'];
|
|
|
|
$sourceImg = imagecreatefromjpeg("../uploads/big/$photo_name");
|
|
|
|
switch($info['orientation']){
|
|
|
|
case 2:
|
|
// mirror
|
|
// not yet implemented
|
|
break;
|
|
|
|
case 3:
|
|
$sourceImg = imagerotate($sourceImg, -180, 0);
|
|
break;
|
|
|
|
case 4:
|
|
// rotate 180 and mirror
|
|
// not yet implemented
|
|
break;
|
|
|
|
case 5:
|
|
// rotate 90 and mirror
|
|
// not yet implemented
|
|
break;
|
|
|
|
case 6:
|
|
$sourceImg = imagerotate($sourceImg, -90, 0);
|
|
$newWidth = $info['height'];
|
|
$newHeight = $info['width'];
|
|
break;
|
|
|
|
case 7:
|
|
// rotate -90 and mirror
|
|
// not yet implemented
|
|
break;
|
|
|
|
case 8:
|
|
$sourceImg = imagerotate($sourceImg, 90, 0);
|
|
$newWidth = $info['height'];
|
|
$newHeight = $info['width'];
|
|
break;
|
|
|
|
}
|
|
|
|
$newSourceImg = imagecreatetruecolor($newWidth, $newHeight);
|
|
|
|
imagecopyresampled($newSourceImg, $sourceImg, 0, 0, 0, 0, $newWidth, $newHeight, $newWidth, $newHeight);
|
|
imagejpeg($newSourceImg, "../uploads/big/$photo_name", 100);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Create Thumb
|
|
if (!createThumb($photo_name)) return false;
|
|
|
|
// Save to DB
|
|
$query = "INSERT INTO lychee_photos (id, title, url, description, type, width, height, size, sysdate, systime, iso, aperture, make, model, shutter, focal, takedate, taketime, thumbUrl, album, public, star, import_name)
|
|
VALUES (
|
|
'" . $id . "',
|
|
'" . $info['title'] . "',
|
|
'" . $photo_name . "',
|
|
'" . $info['description'] . "',
|
|
'" . $info['type'] . "',
|
|
'" . $info['width'] . "',
|
|
'" . $info['height'] . "',
|
|
'" . $info['size'] . "',
|
|
'" . $info['date'] . "',
|
|
'" . $info['time'] . "',
|
|
'" . $info['iso'] . "',
|
|
'" . $info['aperture'] . "',
|
|
'" . $info['make'] . "',
|
|
'" . $info['model'] . "',
|
|
'" . $info['shutter'] . "',
|
|
'" . $info['focal'] . "',
|
|
'" . $info['takeDate'] . "',
|
|
'" . $info['takeTime'] . "',
|
|
'" . md5($id) . ".jpeg',
|
|
'" . $albumID . "',
|
|
'" . $public . "',
|
|
'" . $star . "',
|
|
'" . $import_name . "');";
|
|
$result = $database->query($query);
|
|
|
|
if (!$result) return false;
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
function getInfo($filename) {
|
|
|
|
global $database;
|
|
|
|
$url = '../uploads/big/' . $filename;
|
|
$iptcArray = array();
|
|
$info = getimagesize($url, $iptcArray);
|
|
|
|
// General information
|
|
$return['type'] = $info['mime'];
|
|
$return['width'] = $info[0];
|
|
$return['height'] = $info[1];
|
|
$return['date'] = date('d.m.Y', filectime($url));
|
|
$return['time'] = date('H:i:s', filectime($url));
|
|
|
|
// Size
|
|
$size = filesize($url)/1024;
|
|
if ($size>=1024) $return['size'] = round($size/1024, 1) . ' MB';
|
|
else $return['size'] = round($size, 1) . ' KB';
|
|
|
|
// IPTC Metadata Fallback
|
|
$return['title'] = '';
|
|
$return['description'] = '';
|
|
|
|
// IPTC Metadata
|
|
if(isset($iptcArray['APP13'])) {
|
|
|
|
$iptcInfo = iptcparse($iptcArray['APP13']);
|
|
if (is_array($iptcInfo)) {
|
|
|
|
$temp = $iptcInfo['2#105'][0];
|
|
if (isset($temp)&&strlen($temp)>0) $return['title'] = $temp;
|
|
|
|
$temp = $iptcInfo['2#120'][0];
|
|
if (isset($temp)&&strlen($temp)>0) $return['description'] = $temp;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// EXIF Metadata Fallback
|
|
$return['orientation'] = '';
|
|
$return['iso'] = '';
|
|
$return['aperture'] = '';
|
|
$return['make'] = '';
|
|
$return['model'] = '';
|
|
$return['shutter'] = '';
|
|
$return['focal'] = '';
|
|
$return['takeDate'] = '';
|
|
$return['takeTime'] = '';
|
|
|
|
// EXIF Metadata
|
|
if ($info['mime']=='image/jpeg'&&function_exists('exif_read_data')&&@exif_read_data($url, 'EXIF', 0)) {
|
|
|
|
$exif = exif_read_data($url, 'EXIF', 0);
|
|
|
|
$temp = $exif['Orientation'];
|
|
if (isset($temp)) $return['orientation'] = $temp;
|
|
|
|
$temp = $exif['ISOSpeedRatings'];
|
|
if (isset($temp)) $return['iso'] = $temp;
|
|
|
|
$temp = $exif['COMPUTED']['ApertureFNumber'];
|
|
if (isset($temp)) $return['aperture'] = $temp;
|
|
|
|
$temp = $exif['Make'];
|
|
if (isset($temp)) $return['make'] = $exif['Make'];
|
|
|
|
$temp = $exif['Model'];
|
|
if (isset($temp)) $return['model'] = $temp;
|
|
|
|
$temp = $exif['ExposureTime'];
|
|
if (isset($temp)) $return['shutter'] = $exif['ExposureTime'] . ' Sec.';
|
|
|
|
$temp = $exif['FocalLength'];
|
|
if (isset($temp)) $return['focal'] = ($temp/1) . ' mm';
|
|
|
|
$temp = $exif['DateTimeOriginal'];
|
|
if (isset($temp)) {
|
|
$exifDate = explode(' ', $temp);
|
|
$date = explode(':', $exifDate[0]);
|
|
$return['takeDate'] = $date[2].'.'.$date[1].'.'.$date[0];
|
|
$return['takeTime'] = $exifDate[1];
|
|
}
|
|
|
|
}
|
|
|
|
// Security
|
|
foreach(array_keys($return) as $key) $return[$key] = mysqli_real_escape_string($database, $return[$key]);
|
|
|
|
return $return;
|
|
|
|
}
|
|
|
|
function createThumb($filename, $width = 200, $height = 200) {
|
|
|
|
global $settings;
|
|
|
|
$url = "../uploads/big/$filename";
|
|
$info = getimagesize($url);
|
|
|
|
$photoName = explode(".", $filename);
|
|
$newUrl = "../uploads/thumb/".$photoName[0].".jpeg";
|
|
$newUrl2x = "../uploads/thumb/".$photoName[0]."@2x.jpeg";
|
|
|
|
// Set position and size
|
|
$thumb = imagecreatetruecolor($width, $height);
|
|
$thumb2x = imagecreatetruecolor($width*2, $height*2);
|
|
if ($info[0]<$info[1]) {
|
|
$newSize = $info[0];
|
|
$startWidth = 0;
|
|
$startHeight = $info[1]/2 - $info[0]/2;
|
|
} else {
|
|
$newSize = $info[1];
|
|
$startWidth = $info[0]/2 - $info[1]/2;
|
|
$startHeight = 0;
|
|
}
|
|
|
|
// Fallback for older version
|
|
if ($info['mime']==='image/webp'&&floatval(phpversion())<5.5) return false;
|
|
|
|
// Create new image
|
|
switch($info['mime']) {
|
|
case 'image/jpeg': $sourceImg = imagecreatefromjpeg($url); break;
|
|
case 'image/png': $sourceImg = imagecreatefrompng($url); break;
|
|
case 'image/gif': $sourceImg = imagecreatefromgif($url); break;
|
|
case 'image/webp': $sourceImg = imagecreatefromwebp($url); break;
|
|
default: return false;
|
|
}
|
|
|
|
imagecopyresampled($thumb,$sourceImg,0,0,$startWidth,$startHeight,$width,$height,$newSize,$newSize);
|
|
imagecopyresampled($thumb2x,$sourceImg,0,0,$startWidth,$startHeight,$width*2,$height*2,$newSize,$newSize);
|
|
|
|
imagejpeg($thumb,$newUrl,$settings['thumbQuality']);
|
|
imagejpeg($thumb2x,$newUrl2x,$settings['thumbQuality']);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
function importPhoto($name, $albumID = 0) {
|
|
|
|
$tmp_name = "../uploads/import/$name";
|
|
$info = getimagesize($tmp_name);
|
|
$size = filesize($tmp_name);
|
|
$nameFile = array(array());
|
|
$nameFile[0]['name'] = $name;
|
|
$nameFile[0]['type'] = $info['mime'];
|
|
$nameFile[0]['tmp_name'] = $tmp_name;
|
|
$nameFile[0]['error'] = 0;
|
|
$nameFile[0]['size'] = $size;
|
|
|
|
if (upload($nameFile, $albumID)) return true;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
function importUrl($url, $albumID = 0) {
|
|
|
|
if (strpos($url, ',')!==false) {
|
|
|
|
// Multiple photos
|
|
|
|
$url = explode(',', $url);
|
|
|
|
foreach ($url as &$key) {
|
|
|
|
$key = str_replace(' ', '%20', $key);
|
|
|
|
if (@getimagesize($key)) {
|
|
|
|
$pathinfo = pathinfo($key);
|
|
$filename = $pathinfo['filename'].".".$pathinfo['extension'];
|
|
$tmp_name = "../uploads/import/$filename";
|
|
copy($key, $tmp_name);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return importServer($albumID);
|
|
|
|
} else {
|
|
|
|
// One photo
|
|
|
|
$url = str_replace(' ', '%20', $url);
|
|
|
|
if (@getimagesize($url)) {
|
|
|
|
$pathinfo = pathinfo($url);
|
|
$filename = $pathinfo['filename'].".".$pathinfo['extension'];
|
|
$tmp_name = "../uploads/import/$filename";
|
|
copy($url, $tmp_name);
|
|
return importPhoto($filename, $albumID);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
function importServer($albumID = 0) {
|
|
|
|
global $database;
|
|
|
|
$i = 0;
|
|
$files = glob('../uploads/import/*');
|
|
|
|
foreach ($files as $file) {
|
|
|
|
if (@getimagesize($file)) {
|
|
if (!importPhoto(basename($file), $albumID)) return false;
|
|
$i++;
|
|
}
|
|
|
|
}
|
|
|
|
if ($i===0) return "Warning: Folder empty!";
|
|
return true;
|
|
|
|
}
|
|
|
|
?>
|