80 lines
1.6 KiB
PHP
80 lines
1.6 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
header('Content-Type: application/json');
|
|
|
|
$uploadDir = __DIR__ . '/../../storage/uploads';
|
|
|
|
if (!is_dir($uploadDir)) {
|
|
mkdir($uploadDir, 0755, true);
|
|
}
|
|
|
|
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
|
|
http_response_code(405);
|
|
echo json_encode([
|
|
'success' => false,
|
|
'message' => 'Method Not Allowed'
|
|
]);
|
|
exit;
|
|
}
|
|
|
|
if (!isset($_FILES['image'])) {
|
|
http_response_code(400);
|
|
echo json_encode([
|
|
'success' => false,
|
|
'message' => 'image field required'
|
|
]);
|
|
exit;
|
|
}
|
|
|
|
$file = $_FILES['image'];
|
|
|
|
if ($file['error'] !== UPLOAD_ERR_OK) {
|
|
http_response_code(400);
|
|
echo json_encode([
|
|
'success' => false,
|
|
'message' => 'Upload failed',
|
|
'error' => $file['error']
|
|
]);
|
|
exit;
|
|
}
|
|
|
|
$finfo = new finfo(FILEINFO_MIME_TYPE);
|
|
|
|
$mime = $finfo->file($file['tmp_name']);
|
|
|
|
$allowed = [
|
|
'image/jpeg' => 'jpg',
|
|
'image/png' => 'png',
|
|
'image/webp' => 'webp',
|
|
];
|
|
|
|
if (!isset($allowed[$mime])) {
|
|
http_response_code(400);
|
|
echo json_encode([
|
|
'success' => false,
|
|
'message' => 'Invalid image type'
|
|
]);
|
|
exit;
|
|
}
|
|
|
|
$filename = bin2hex(random_bytes(16)) . '.' . $allowed[$mime];
|
|
$destination = $uploadDir . '/' . $filename;
|
|
|
|
if (!move_uploaded_file($file['tmp_name'], $destination)) {
|
|
http_response_code(500);
|
|
echo json_encode([
|
|
'success' => false,
|
|
'message' => 'Cannot save file'
|
|
]);
|
|
exit;
|
|
}
|
|
|
|
echo json_encode([
|
|
'success' => true,
|
|
'filename' => $filename,
|
|
'url' => '/uploads/' . $filename,
|
|
'size' => filesize($destination),
|
|
'mime' => $mime,
|
|
]); |