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>
This commit is contained in:
@@ -498,7 +498,9 @@
|
||||
formData.append('file', resized, resized.name || 'image.jpg');
|
||||
try {
|
||||
const res = await fetch('upload.php', { method: 'POST', body: formData });
|
||||
const data = await res.json();
|
||||
const text = await res.text();
|
||||
let data;
|
||||
try { data = JSON.parse(text); } catch(e) { throw new Error('Palvelin vastasi (HTTP ' + res.status + '): ' + (text.slice(0, 200) || '(tyhjä)')); }
|
||||
if (data.error) throw new Error(data.error);
|
||||
document.getElementById(hiddenId).value = data.url;
|
||||
const prev = document.getElementById(previewId);
|
||||
|
||||
@@ -434,7 +434,9 @@ async function uploadImg(input, hiddenId, previewId, labelId) {
|
||||
formData.append('file', resized, resized.name || 'image.jpg');
|
||||
try {
|
||||
const res = await fetch('upload.php', { method: 'POST', body: formData });
|
||||
const data = await res.json();
|
||||
const text = await res.text();
|
||||
let data;
|
||||
try { data = JSON.parse(text); } catch(e) { throw new Error('Palvelin vastasi (HTTP ' + res.status + '): ' + (text.slice(0, 200) || '(tyhjä)')); }
|
||||
if (data.error) throw new Error(data.error);
|
||||
document.getElementById(hiddenId).value = data.url;
|
||||
const prev = document.getElementById(previewId);
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
* 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
|
||||
@@ -10,12 +12,14 @@ $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;
|
||||
@@ -25,12 +29,14 @@ $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;
|
||||
@@ -38,6 +44,7 @@ if ($f['size'] > $max_bytes) {
|
||||
|
||||
$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;
|
||||
@@ -56,10 +63,12 @@ $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]);
|
||||
|
||||
Reference in New Issue
Block a user