Files
tykkaa.fi/upload.php
Jukka Lampikoski bb9541d526 Parempi virheenkäsittely uploadissa: näytä palvelimen tarkka vastaus
- upload.php: ob_start()+error_reporting(0) estää PHP-varoitusten
  sekoittumisen JSON-vastaukseen; ob_clean() ennen jokaista echoa
- script.js + admin.html: lue vastaus ensin tekstinä, yritä sitten
  JSON-parsinta ja näytä tarkka virheviesti (HTTP-koodi + raakavastaus)
  jos JSON ei onnistu

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-08 01:20:20 +02:00

75 lines
2.0 KiB
PHP

<?php
/**
* tykkää.fi — kuvaupload-käsittelijä
* Tallentaa kuvat images/-kansioon.
*/
ob_start();
error_reporting(0);
$allowed_mime = ['image/jpeg', 'image/png', 'image/gif', 'image/webp'];
$max_bytes = 20 * 1024 * 1024; // 20 Mt
header('Content-Type: application/json');
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
ob_clean();
http_response_code(405);
echo json_encode(['error' => 'Method not allowed']);
exit;
}
if (empty($_FILES['file'])) {
ob_clean();
http_response_code(400);
echo json_encode(['error' => 'No file']);
exit;
}
$f = $_FILES['file'];
if ($f['error'] !== UPLOAD_ERR_OK) {
$codes = [1=>'Tiedosto ylittää php.ini upload_max_filesize',2=>'Tiedosto ylittää MAX_FILE_SIZE',3=>'Tiedosto tuli vain osittain',6=>'Ei temp-kansiota',7=>'Levylle kirjoitus epäonnistui'];
ob_clean();
http_response_code(400);
echo json_encode(['error' => 'Lähetysvirhe: ' . ($codes[$f['error']] ?? 'koodi '.$f['error'])]);
exit;
}
if ($f['size'] > $max_bytes) {
ob_clean();
http_response_code(413);
echo json_encode(['error' => 'Tiedosto liian suuri (max 20 Mt)']);
exit;
}
$mime = mime_content_type($f['tmp_name']);
if (!in_array($mime, $allowed_mime, true)) {
ob_clean();
http_response_code(415);
echo json_encode(['error' => 'Only images (jpeg/png/gif/webp) allowed']);
exit;
}
$ext_map = ['image/jpeg' => '.jpg', 'image/png' => '.png',
'image/gif' => '.gif', 'image/webp' => '.webp'];
$ext = $ext_map[$mime] ?? '.jpg';
$dir = __DIR__ . '/images/';
if (!is_dir($dir)) {
mkdir($dir, 0755, true);
}
$fname = round(microtime(true) * 1000) . $ext;
$dest = $dir . $fname;
if (!move_uploaded_file($f['tmp_name'], $dest)) {
ob_clean();
http_response_code(500);
$writable = is_writable($dir) ? 'kirjoitusoikeus ok' : 'EI kirjoitusoikeutta';
echo json_encode(['error' => "Tiedoston tallennus epäonnistui. Kansio images/: $writable"]);
exit;
}
ob_clean();
echo json_encode(['url' => 'images/' . $fname]);