[gelöst] PHP Upload Script funktioniert nicht immer

Debian macht sich hervorragend als Web- und Mailserver. Schau auch in den " Tipps und Tricks"-Bereich.
Antworten
Benutzeravatar
MSfree
Beiträge: 11605
Registriert: 25.09.2007 19:59:30

[gelöst] PHP Upload Script funktioniert nicht immer

Beitrag von MSfree » 29.05.2024 19:08:01

Ich habe auf meinerm Heimserver ein simples PHP-Skript, über das ich Dateien auf meinen Server transferieren kann. Der Mechanismus besteht aus einer simplen HTML-Datei:

Code: Alles auswählen

<html>
<head></head>
<body>
<h4> File uploads </h4>

<form enctype="multipart/form-data" action="/upload/upload.php" method="POST">
    <input type="hidden" name="MAX_FILE_SIZE" value="200000000" />
    Send this file: <input name="uploadedfile" type="file" />
    <input type="submit" value="Send File" />
</form>

max allowed upload: 200MByte
</body>
</html>
und dem PHP-Teil

Code: Alles auswählen

<?php

$target_path = "/pub/incoming/";
$target_path = $target_path . basename( $_FILES['uploadedfile']['name']); 

echo "Source=" .        $_FILES['uploadedfile']['name'] . "<br />"; 
echo "Destination=" .   $destination_path . "<br />"; 
echo "Target path=" .   $target_path . "<br />"; 
echo "Size=" .          $_FILES['uploadedfile']['size'] . "<br />"; 

if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {
    echo "The file ".  basename( $_FILES['uploadedfile']['name']). 
    " has been uploaded";
} else{
    echo "There was an error uploading the file, please try again!";
}
?>
Die echos sind zu Debugzwecken im Code.

Versuche ich, z.B. eine jpg-Datei hochzuladen, bekomme ich im funktionierenden Fall folgende Ausgabe im Browser:

Code: Alles auswählen

Source=emu.jpg
Destination=
Target path=/pub/incoming/emu.jpg
Size=198142
The file emu.jpg has been uploaded
Wenn es nicht funktioniert, habe ich folgende Ausgabe im Browser:

Code: Alles auswählen

Source=P5252475.JPG
Destination=
Target path=/pub/incoming/P5252475.JPG
Size=0
There was an error uploading the file, please try again!
Die einzige Systematik, die ich erkenne, ist, daß wenn SIZE=0 ist, dann funktioniert der Upload nicht. Aber woran kann das denn liegen? Ich hatte das Skript schon seit ungefähr 10 Jahren im Einsatz und es hat früher immer problemlos funktioniert, zumindest bis zu 200 Millionen Bytes Dateigröße. Jetzt versagt es aber schon bei Dateien mit 7.5MB. Ich kann aber keine Systematik erkennen, die mit der Dateigröße zusammenhängt, denn ich hatte auch schon Dateien mit ein paar hundert kB, die nicht hochladbar waren.
Zuletzt geändert von MSfree am 29.05.2024 20:39:13, insgesamt 1-mal geändert.

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: PHP Upload Script funktioniert nicht immer

Beitrag von heisenberg » 29.05.2024 19:10:28

Irgendwas im ...

PHP-Error-Log?
Webserver-Error-Log?

Statt dem echo im Error-Zweig vielleicht mal Fehler mit Fehlermeldung protokollieren?

Code: Alles auswählen

error_log(print_r(error_get_last(),true));
Und natürlich error_reporting auf Max stellen:

Code: Alles auswählen

error_reporting(E_ALL);

Benutzeravatar
MSfree
Beiträge: 11605
Registriert: 25.09.2007 19:59:30

Re: PHP Upload Script funktioniert nicht immer

Beitrag von MSfree » 29.05.2024 19:23:14

heisenberg hat geschrieben: ↑ zum Beitrag ↑
29.05.2024 19:10:28
Irgendwas im ...

PHP-Error-Log?
Auf meinem System habe ich bisher keine PHP-(error)-Logs gefunden. Das ist eine normale Apache2 Installation ohne große Modifikationen.
Webserver-Error-Log?
Da kommt:

Code: Alles auswählen

[Wed May 29 19:01:40.992027 2024] [php:warn] [pid 464139] [client 192.168.31.92:49036] PHP Warning:  Undefined variable $destination_path in /usr/share/upload/upload.php on line 7, referer: http://cargobay.####.private/upload/
Aber das ist nur eine Warnung, die im funktionierenden und im nicht funktionierenden Fall kommt.
Statt dem echo im Error-Zweig vielleicht mal das hier loggen:

Code: Alles auswählen

error_log(print_r(error_get_last(),true));
Dann kommt im /var/log/apache2/error.log folgendes:

Code: Alles auswählen

[Wed May 29 19:17:01.383919 2024] [php:notice] [pid 471648] [client 192.168.31.92:50838] Array
(
     [type] => 2
     [message] => Undefined variable $destination_path
     [file] => /usr/share/upload/upload.php
     [line] => 7
)
, referer: http://cargobay.####.private/upload/

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: PHP Upload Script funktioniert nicht immer

Beitrag von heisenberg » 29.05.2024 19:29:35

Ja. Das $destination_path (nicht deklarierte Variable) dürfte nix ausmachen. Ist - wie Du schreibst nur eine Warnung. Aber nimm' es doch trotzdem mal raus.

Bei mir ist das Size Element leer, wenn ich z. B. die maximale Dateigröße überschreite. Das sieht man dann aber im Apache-Error-Log.

Könnte es sein, dass da mal neue PHP-Versionen eingespielt wurden und dass die Einstellungen nicht mehr passen?

Code: Alles auswählen

post_max_size
upload_max_file_size
max_execution_time

thoerb
Beiträge: 1686
Registriert: 01.08.2012 15:34:53
Lizenz eigener Beiträge: MIT Lizenz

Re: PHP Upload Script funktioniert nicht immer

Beitrag von thoerb » 29.05.2024 19:46:39

MSfree hat geschrieben: ↑ zum Beitrag ↑
29.05.2024 19:08:01
Die einzige Systematik, die ich erkenne, ist, daß wenn SIZE=0 ist, dann funktioniert der Upload nicht. Aber woran kann das denn liegen? Ich hatte das Skript schon seit ungefähr 10 Jahren im Einsatz und es hat früher immer problemlos funktioniert, zumindest bis zu 200 Millionen Bytes Dateigröße. Jetzt versagt es aber schon bei Dateien mit 7.5MB. Ich kann aber keine Systematik erkennen, die mit der Dateigröße zusammenhängt, denn ich hatte auch schon Dateien mit ein paar hundert kB, die nicht hochladbar waren.
https://www.php.net/manual/de/ini.core. ... t-max-size
Wenn die Größe der POST-Daten größer ist als post_max_size, werden die $_POST- und $_FILES-Superglobals leer sein.
Schau dir mal deine /etc/php/8.2/apache2/php.ini an.

Benutzeravatar
MSfree
Beiträge: 11605
Registriert: 25.09.2007 19:59:30

Re: PHP Upload Script funktioniert nicht immer

Beitrag von MSfree » 29.05.2024 19:59:23

heisenberg hat geschrieben: ↑ zum Beitrag ↑
29.05.2024 19:29:35
Ja. Das $destination_path (nicht deklarierte Variable) dürfte nix ausmachen. Ist - wie Du schreibst nur eine Warnung. Aber nimm' es doch trotzdem mal raus.
Wo soll ich das rausnehmen?
In dem PHP-Skript ist es ja nur einmal in den Debug-echos drin.
Könnte es sein, dass da mal neue PHP-Versionen eingespielt wurden und dass die Einstellungen nicht mehr passen?
Der Server wurde vor ca. 1.5 Jahren komplett neu mit Bookworm aufgesetzt. Vorher war da jahrelang Jessie im Einsatz. Daher gab es auch eine neue PHP-Version und seither gibt es mit dem Skript Problem. Ich brauche diese Uploadmöglichkeit nur alle jubeljahre mal, nur gerade hat es mich mal wieder geärgert.
Bei mir ist das Size Element leer, wenn ich z. B. die maximale Dateigröße überschreite. Das sieht man dann aber im Apache-Error-Log.
Sowas hatte ich auch schon in Verdacht, aber eine 7.5MB Datei sollte mit folgenden Einstellungen doch übertragbar sein:

Code: Alles auswählen

max_execution_time = 30
post_max_size = 8M
upload_max_file_size kann ich gar nicht auf der Kiste finden. Habe gerade alle Dateien unter /usr/share und /etc nach dem String durchsucht.

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: PHP Upload Script funktioniert nicht immer

Beitrag von heisenberg » 29.05.2024 20:08:46

Dann lege im Order von upload.php mal eine t.php an mit dem Inhalt unten, lasse Dir damit die Live-Konfigurationswerte anzeigen und schaue welche Werte die 3 Variablen haben:

Code: Alles auswählen

<?php
phpinfo();
Das upload_max_file_size nicht gesetzt ist, ist ein möglicher Fehler.

thoerb
Beiträge: 1686
Registriert: 01.08.2012 15:34:53
Lizenz eigener Beiträge: MIT Lizenz

Re: PHP Upload Script funktioniert nicht immer

Beitrag von thoerb » 29.05.2024 20:12:15

MSfree hat geschrieben: ↑ zum Beitrag ↑
29.05.2024 19:59:23
upload_max_file_size kann ich gar nicht auf der Kiste finden. Habe gerade alle Dateien unter /usr/share und /etc nach dem String durchsucht.
post_max_size findest du in der php.ini.

Benutzeravatar
MSfree
Beiträge: 11605
Registriert: 25.09.2007 19:59:30

Re: PHP Upload Script funktioniert nicht immer

Beitrag von MSfree » 29.05.2024 20:18:07

heisenberg hat geschrieben: ↑ zum Beitrag ↑
29.05.2024 20:08:46
Dann lege im Order von upload.php mal eine t.php an mit dem Inhalt unten, lasse Dir damit die Live-Konfigurationswerte anzeigen und schaue welche Werte die 3 Variablen haben:

Code: Alles auswählen

<?php
phpinfo();
Da kommen wir der Sache schon näher,
max_execution_time = 30
post_max_size = 8M
upload_max_filesize =2M
Die upload_max_filesize sollte eigentlich 200M sein. Ich meine mich auch zu erinnern, daß ich unter Jessie den Wert irgendwo mit 200000000 eingetragen hatte, nur weiß ich nicht mehr wo.
Das upload_max_file_size nicht gesetzt ist, ist ein möglicher Fehler.
Der Default von 2M ist deutlich zu klein. Ob ich die post_max_size auch anpassen muß, weiß ich nicht mehr.

thoerb
Beiträge: 1686
Registriert: 01.08.2012 15:34:53
Lizenz eigener Beiträge: MIT Lizenz

Re: PHP Upload Script funktioniert nicht immer

Beitrag von thoerb » 29.05.2024 20:23:01

Du könntest dir auch in deinem Script zusätzlich Fehler ausgeben lassen:

Code: Alles auswählen

echo "Error=" .          $_FILES['uploadedfile']['error'] . "<br />";
https://www.php.net/manual/de/features. ... method.php

Benutzeravatar
MSfree
Beiträge: 11605
Registriert: 25.09.2007 19:59:30

Re: PHP Upload Script funktioniert nicht immer

Beitrag von MSfree » 29.05.2024 20:38:52

Ich habe die Werte

Code: Alles auswählen

upload_max_filesize = 200M
post_max_size = 200M
in /etc/php/8.2/apache2/php.ini eingetragen.

Jetzt klappt es endlich mit dem Upload, zumindest bis 200MByte, aber das reicht mir erstmal.

Vielen Dank für die Hilfe.

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: [gelöst] PHP Upload Script funktioniert nicht immer

Beitrag von heisenberg » 29.05.2024 21:06:48

Wie geschrieben, wenn 30 Sekunden uploadzeit nicht ausreichen muss das hier noch erhöht werden ... Im LAN mag das ja noch gut gehen, aber wenn's von außen kommt ...

Code: Alles auswählen

max_input_time = 30
Edit

Fehler meinerseits: max_execution_time scheint bei den Uploads keine Rolle zu spielen, aber max_input_time.

Siehe: php.net file-upload: common pitfalls
($destination_path)

Wo soll ich das rausnehmen?
In dem PHP-Skript ist es ja nur einmal in den Debug-echos drin.
Genau da.

Benutzeravatar
MSfree
Beiträge: 11605
Registriert: 25.09.2007 19:59:30

Re: [gelöst] PHP Upload Script funktioniert nicht immer

Beitrag von MSfree » 30.05.2024 13:51:52

heisenberg hat geschrieben: ↑ zum Beitrag ↑
29.05.2024 21:06:48
wenn 30 Sekunden uploadzeit nicht ausreichen muss das hier noch erhöht werden ... Im LAN mag das ja noch gut gehen, aber wenn's von außen kommt ...

Code: Alles auswählen

max_input_time = 30
Ich habe es mir mal notiert. Im (W)LAN spielt das tatsächlich kaum eine Rolle, denn 200MB/30s sind 6.7MB/s und die erreichte ich praktisch immer, unter 125MBit/s fällt mein WLAN eigenlich nur auf meinem Balkon.

Der Haupteinsatzzweck ist eigentlich, um "mal schnell" ein Bild vom iPhone an eine Stelle zu befördern, wo ich von anderen Rechnern aus einfach zugreifen kann. Ich könnte natürlich das iPhone auch mit meinem Macbook synchronisieren, aber der Aufwand ist dann doch größer. Selbst Nextcloud ist deutlich umständlicher wann man nur eine Datei hochladen will.

Zur Übertragung über das Internet habe ich das natürlich auch schon genutzt, aber da reicht mir meistens ein USB-Stick, den ich am Server anstecke, wenn ich wieder zuhause bin.

Antworten