v1.0.0.1
StocketBase
- <?php
-
- declare(strict_types=1);
-
- require_once __DIR__ . '/includes/config.php';
- require_once __DIR__ . '/includes/database.php';
- require_once __DIR__ . '/includes/auth.php';
- require_once __DIR__ . '/includes/csrf.php';
-
- Auth::boot();
- Auth::requireLogin();
-
- header('Content-Type: application/json');
-
- if ($_SERVER['REQUEST_METHOD'] !== 'POST' || !Csrf::verify($_POST['csrf_token'] ?? null)) {
- http_response_code(403);
- echo json_encode(['success' => false, 'error' => 'Something went wrong. Please refresh the page and try again.']);
- exit;
- }
-
- if (!isset($_FILES['file']) || $_FILES['file']['error'] !== UPLOAD_ERR_OK) {
- http_response_code(400);
- echo json_encode(['success' => false, 'error' => 'The upload didn\'t work. Please try again.']);
- exit;
- }
-
- $file = $_FILES['file'];
- $maxBytes = 25 * 1024 * 1024;
-
- if ($file['size'] > $maxBytes) {
- http_response_code(400);
- echo json_encode(['success' => false, 'error' => 'That file is too big. The limit is 25 MB.']);
- exit;
- }
-
- $allowedTypes = [
- 'image/jpeg' => ['ext' => 'jpg', 'folder' => 'img'],
- 'image/png' => ['ext' => 'png', 'folder' => 'img'],
- 'image/gif' => ['ext' => 'gif', 'folder' => 'img'],
- 'image/webp' => ['ext' => 'webp', 'folder' => 'img'],
- 'video/mp4' => ['ext' => 'mp4', 'folder' => 'videos'],
- 'video/webm' => ['ext' => 'webm', 'folder' => 'videos'],
- ];
-
- $finfo = finfo_open(FILEINFO_MIME_TYPE);
- $mimeType = finfo_file($finfo, $file['tmp_name']);
-
- if (!isset($allowedTypes[$mimeType])) {
- http_response_code(400);
- echo json_encode(['success' => false, 'error' => 'That file type isn\'t supported. Use JPG, PNG, GIF, WebP, MP4 or WebM.']);
- exit;
- }
-
- $typeInfo = $allowedTypes[$mimeType];
- $targetDir = __DIR__ . '/media/' . $typeInfo['folder'];
-
- if (!is_dir($targetDir)) {
- mkdir($targetDir, 0750, true);
- }
-
- $fileName = bin2hex(random_bytes(16)) . '.' . $typeInfo['ext'];
- $targetPath = $targetDir . '/' . $fileName;
-
- if (!move_uploaded_file($file['tmp_name'], $targetPath)) {
- http_response_code(500);
- echo json_encode(['success' => false, 'error' => 'We couldn\'t save the file. Please try again.']);
- exit;
- }
-
- echo json_encode([
- 'success' => true,
- 'url' => 'media/' . $typeInfo['folder'] . '/' . $fileName,
- ]);
-