162 lines
4.4 KiB
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;
|
|
}
|
|
|
|
}
|