4in1_ws_web/lib/uploads.php

162 lines
4.4 KiB
PHP

<?php
class uploads {
const array ALLOWED_EXTENSIONS = [
'jpg', 'png', 'git', 'mp4', 'mp3', 'ogg', 'diff', 'txt', 'gz', 'tar',
'icc', 'icm', 'patch', 'zip', 'brd', 'pdf', 'lua', 'xpi', 'rar', '7z',
'tgz', 'bin', 'py', 'pac', 'yaml', 'toml', 'xml', 'json', 'yml',
];
public static function getCount(): int {
$db = DB();
return (int)$db->result($db->query("SELECT COUNT(*) FROM uploads"));
}
public static function isExtensionAllowed(string $ext): bool {
return in_array($ext, self::ALLOWED_EXTENSIONS);
}
public static function add(string $tmp_name,
string $name,
string $note_en = '',
string $note_ru = '',
string $source_url = ''): ?int {
global $config;
$name = sanitizeFilename($name);
if (!$name)
$name = 'file';
$random_id = self::_getNewUploadRandomId();
$size = filesize($tmp_name);
$is_image = detectImageType($tmp_name) !== false;
$image_w = 0;
$image_h = 0;
if ($is_image) {
list($image_w, $image_h) = getimagesize($tmp_name);
}
$db = DB();
if (!$db->insert('uploads', [
'random_id' => $random_id,
'ts' => time(),
'name' => $name,
'size' => $size,
'image' => (int)$is_image,
'image_w' => $image_w,
'image_h' => $image_h,
'note_ru' => $note_ru,
'note_en' => $note_en,
'downloads' => 0,
'source_url' => $source_url,
])) {
return null;
}
$id = $db->insertId();
$dir = $config['uploads_dir'].'/'.$random_id;
$path = $dir.'/'.$name;
mkdir($dir);
chmod($dir, 0775); // g+w
rename($tmp_name, $path);
setperm($path);
return $id;
}
public static function delete(int $id): bool {
$upload = self::get($id);
if (!$upload)
return false;
$db = DB();
$db->query("DELETE FROM uploads WHERE id=?", $id);
rrmdir($upload->getDirectory());
return true;
}
/**
* @return Upload[]
*/
public static function getAllUploads(): array {
$db = DB();
$q = $db->query("SELECT * FROM uploads ORDER BY id DESC");
return array_map('Upload::create_instance', $db->fetchAll($q));
}
public static function get(int $id): ?Upload {
$db = DB();
$q = $db->query("SELECT * FROM uploads WHERE id=?", $id);
if ($db->numRows($q)) {
return new Upload($db->fetch($q));
} else {
return null;
}
}
/**
* @param string[] $ids
* @param bool $flat
* @return Upload[]
*/
public static function getUploadsByRandomId(array $ids, bool $flat = false): array {
if (empty($ids)) {
return [];
}
$db = DB();
$uploads = array_fill_keys($ids, null);
$q = $db->query("SELECT * FROM uploads WHERE random_id IN('".implode('\',\'', array_map([$db, 'escape'], $ids))."')");
while ($row = $db->fetch($q)) {
$uploads[$row['random_id']] = new Upload($row);
}
if ($flat) {
$list = [];
foreach ($ids as $id) {
$list[] = $uploads[$id];
}
unset($uploads);
return $list;
}
return $uploads;
}
public static function getUploadByRandomId(string $random_id): ?Upload {
$db = DB();
$q = $db->query("SELECT * FROM uploads WHERE random_id=? LIMIT 1", $random_id);
if ($db->numRows($q)) {
return new Upload($db->fetch($q));
} else {
return null;
}
}
public static function getUploadBySourceUrl(string $source_url): ?Upload {
$db = DB();
$q = $db->query("SELECT * FROM uploads WHERE source_url=? LIMIT 1", $source_url);
if ($db->numRows($q)) {
return new Upload($db->fetch($q));
} else {
return null;
}
}
public static function _getNewUploadRandomId(): string {
$db = DB();
do {
$random_id = strgen(8);
} while ($db->numRows($db->query("SELECT id FROM uploads WHERE random_id=?", $random_id)) > 0);
return $random_id;
}
}