Seite 1 von 2

PHP: Fehlermeldung verhindern. - Datei Upload

Verfasst: 18.10.2010, 18:34
von Wirths Media
Hallo,

bin gerade auf der Suche nach einer Lösung für meine ausgegebene Fehlermeldung.

Code: Alles auswählen

Warning: POST Content-Length of 134981173 bytes exceeds the limit of 134217728 bytes in Unknown on line 0
Dies ist soweit ja auch richtig, die Datei ist für den Upload zu groß, jedoch möchte ich gerne meine eigene Fehlermeldung ausgeben und nicht die von PHP.

Wie kann ich diese unterdrücken?

Habe schon error_reporting(0); eingestellt, jedoch ohne Erfolg.

Bekomme diese einfach nicht weg.

Gruß
Daniel

Verfasst:
von

Verfasst: 19.10.2010, 17:11
von xlb
Könntest du mal deine phpinfo und ggf. relevanten Quellcode ins Netz stellen?

Kann dein Problem auf die Schnelle nicht reproduzieren. Bekomme, egal welche Upload-Fehler ich provoziere (und ggf. explizit anzeigen lasse), trotzdem immer "brav" das $_FILES-Array - mit der entsprechenden Fehler-Nummer ...

Ohne die Fehleranzeige händisch "scharf zu schalten", kommt weder eine Notice, noch ein Warning oder Error ...

Verfasst: 19.10.2010, 18:18
von danielsun174
einfach vor die php funktion ein @ machen. also so z.B:

Code: Alles auswählen

<?php @filgetscontent&#40;&#41;;?>

Verfasst:
von

Verfasst: 19.10.2010, 20:32
von threadi
@danielsun174: Damit unterdrückt man lediglich die Fehlerausgabe, aber nicht den Fehler.

Verfasst: 19.10.2010, 21:32
von xlb
@danielsun174
danielsun174 hat geschrieben:einfach vor die php funktion ein @ machen.
Welche "Funktion" ...? Hast du dir'n Upload schon mal näher angesehen? :wink:

Verfasst: 20.10.2010, 09:33
von nerd
kanns vielleicht sein das der upload groesser als in der php.ini erlaubt ist...?
https://drupal.org/node/97193

Verfasst: 20.10.2010, 12:26
von xlb
nerd hat geschrieben:kanns vielleicht sein das der upload groesser als in der php.ini erlaubt ist...?
Jo, darauf läuft's hinaus. Allerdings wird eine solcher Fehler bei mir bekannten/aktuellen PHP-Versionen nicht mit einer Warnung quittiert, sondern durch einen entsprechenden Fehler-Code im $_FILES-Array - um eben eine Skript-seitige Reaktion auf den Fehler zu ermöglichen.

Aufschluss könnte ein Blick in die PHP-Info und den Quellcode geben ...

Ein Blick ins Google Orakel zeigt, dass calusa-xx mit dem Warning-Problem nicht allein da steht. Lösung brachte in diesen Fällen tatsächlich nur ein Anpassen entsprechender Parameter in der Ini (was für die Meisten wahrscheinlich so ohne weiteres nicht möglich sein dürfte) - das kann's aber nicht sein ...

Verfasst: 20.10.2010, 12:36
von Wirths Media
Hallo,

hier einmla das Script in verkürzter Version:

Code: Alles auswählen

<?php
error_reporting&#40;0&#41;;

$daten&#91;"dateiendung"&#93; = 'jpg|gif|doc';
$daten&#91;"dateigroesse"&#93; = '10';

if&#40;$_FILES&#91;"datei"&#93; && !$_FILES&#91;"datei"&#93;&#91;"error"&#93;&#41;
&#123;
	// Prüfen ob Dateiupload erlaubt / möglich
	if&#40;$_FILES&#91;"datei"&#93; && eregi&#40;"&#40;".$daten&#91;"dateiendung"&#93;."&#41;$", $_FILES&#91;"datei"&#93;&#91;'name'&#93;&#41;&#41;
	&#123;
		// Umrechnung MB in Byte
		$dateigroesse = $daten&#91;"dateigroesse"&#93; * 1048576; // Maximal 10MB erlaubt


		if&#40;$_FILES&#91;"datei"&#93;&#91;"size"&#93; < $dateigroesse&#41;
		&#123;
			// Nächsten freien Platz ermitteln
			$p = "0";

			while&#40;$_SESSION&#91;"auftrag"&#93;&#91;"datei"&#93;&#91;$p&#93;&#41;
				++$p;


			// Dateiupload in SESSION
			$_SESSION&#91;"datei"&#93;&#91;$p&#93; = $_FILES;
			$_SESSION&#91;"datei"&#93;&#91;$p&#93;&#91;"daten"&#93; = file_get_contents&#40;$_FILES&#91;"datei"&#93;&#91;"tmp_name"&#93;&#41;;

			$_GET&#91;"msg"&#93;&#91;&#93; = 'Datei hochgeladen.';
		&#125;
		else
		&#123;
			$_GET&#91;"msg"&#93;&#91;&#93; = 'Datei zu groß maximal '.$daten&#91;"dateigroesse"&#93;.' Megabyte.';
		&#125;
	&#125;
	else
	&#123;
		$_GET&#91;"msg"&#93;&#91;&#93; = 'Dateityp nicht erlaubt.';
	&#125;
&#125;


// Content erstellen und ausgeben
echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
	"http&#58;//www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http&#58;//www.w3.org/1999/xhtml" lang="de" xml&#58;lang="de">

<head>
	<link rel="stylesheet" type="text/css" href="/css/main.css" media="screen" />
</head>

<body style="background&#58; #fff; padding&#58; 0; margin&#58;0;">

'.$msg.'

<form action="'.phpself&#40;&#41;.'" method="post" enctype="multipart/form-data">
	<input type="file" name="datei" style="width&#58; 400px;" />
	<input type="submit" name="submit" class="submit" value="Datei hochladen" />
</form>';

// Dateiübersicht erstellen
if&#40;$_SESSION&#91;"auftrag"&#93;&#91;"datei"&#93;&#41;
&#123;
	echo '<br /><br />';

	foreach&#40;$_SESSION&#91;"datei"&#93; as $k=>$v&#41;
		echo '<a target="_blank" href="'.phpself&#40;&#41;.'?show=yes&datei='.$k.'">'.$v&#91;"datei"&#93;&#91;"name"&#93;.'</a>';
&#125;


echo '</body>
</html>';
?>
Da die Fehlermedung in Zeile 0 auftritt ändert ein @ von file... garnichts...

Her noch ein Aufzug aus der phpinfo()

Code: Alles auswählen

PHP Version 5.3.0
upload_max_filesize 128M 128M 
track_errors Off Off 

Verfasst: 20.10.2010, 12:37
von Wirths Media
Achso die Datei zum testen ist natürlich größer als 128 MB.

Gruß
Daniel

Verfasst: 20.10.2010, 12:56
von xlb

Code: Alles auswählen

<form action="'.phpself&#40;&#41;.'" method="post" enctype="multipart/form-data"> 
   <input type="file" name="datei" style="width&#58; 400px;" /> 
   <input type="submit" name="submit" class="submit" value="Datei hochladen" /> 
</form>'; 
Was ist phpself()? Da müsste/könnte stehen $_SERVER['PHP_SELF'], um die Daten an sich selbst zu schicken ("Affen-Formular"). Oder hast du dir eine eigene Funktion geschrieben?

Wenn als "action" im Formular Murks angeben wird, würde dies zumindest das ...
... in Unknown on line 0
... erklären. Das verarbeitende Skript-File existiert nicht! Somit landest du im "Nichts", der Fehler wird vom Interpreter erzeugt und ausgegeben. Da kommt nie ein Skript zum Zuge, dass den Fehler abfangen oder anzeigen könnte. Daher auch kein error_reporting(0).

Verfasst: 20.10.2010, 13:23
von Wirths Media
Nein, da könnte auch $_SERVER["PHP_SELF"] stehen ist fast das selbe.

Das Script funktioniert einwandfrei, nur eben nicht, wenn die Datei zu groß ist.

Gruß
Daniel

Verfasst: 20.10.2010, 16:02
von SloMo
Das Error-Reporting für Warnungen muss in diesem Fall vor der Ausfürung abgeschaltet werden, also in der php.ini oder per .htaccess-Eintrag. Im Script ist es zu spät. Deshalb ja auch "Unknown on line 0".

Verfasst: 20.10.2010, 16:49
von Wirths Media
Eigentlich wollte ich error_reporting nicht auf null stellen.

Gibt es keine andere Lösung?

Verfasst: 20.10.2010, 16:53
von Synonym
Slomo hat es eigentlich schon gesagt.

und das hier ist Quatsch
Allerdings wird eine solcher Fehler bei mir bekannten/aktuellen PHP-Versionen nicht mit einer Warnung quittiert
Die Warnungen werden in allen Versionen erzeugt. Die Übergabe ins "Rückgabe-Array" ist nur ein Zusatz um darauf entsprechend reagieren zu können. https://www.php.net/manual/de/features. ... errors.php

Also entweder Du schaltest error_reporting ab, oder Du unterdrückst die Fehlerausgabe auf dem Display und aktivierst dafür das Error-Log. Letzteres sollte eigentlich bei allen produktiven Systemen verwendet werden. Die Fehler werden dann ja weiterhin bekannt gegeben, nur eben nicht mit auf dem Bildschirm.
You're strongly advised to use error logging in place of error displaying on production web sites.
https://www.php.net/manual/de/errorfunc ... lay-errors
https://www.php.net/manual/de/errorfunc ... .error-log

Verfasst: 20.10.2010, 17:34
von SloMo
Eventuell mit einem versteckten Formularfeld MAX_FILE_SIZE verhindern, dass der normale User so eine große Datei schickt. Da kann man vielleicht auch clientseitig per JavaScript etwas drehen, um eine eigene Fehlermeldung anzuzeigen. Das ersetzt aber keine serverseitigen Maßnahmen.