Dateien mit Safari hochladen und PHP

Wer PHP-Seiten erstellt und dort eventuell auch mal das Hochladen von Dateien zulassen möchte, erlebt unter bestimmten Umständen (die sich mir bisher noch nicht ganz erschließen), dass Safari (alle Versionen) dies nicht mehr zulässt. Er lädt und lädt, aber nichts passiert. Wer das feine Programm Little Snitch dabei im Einsatz hat, wird oben im Netzwerkmonitor sehen, dass kein Netzwerkverkehr mehr stattfindet, d.h. Safari befindet sich sozusagen im Leerlauf, obwohl er anzeigt, dass er die Datei hochlädt. Das ganze betrifft übrigens nicht nur PHP, jedes andere System ist davon auch betroffen.

Was also tun? Die Lösung ist geradezu banal! Als erste Zeile in der PHP-Seite einfach folgenden Schnipsel einfügen:

<?php header("Connection: close"); ?>

Das war’s schon. Zitat aus den header-Docs:

HTTP/1.1 defines the „close“ connection option for the sender to signal that the connection will be closed after completion of the response. For example,

Connection: close
in either the request or the response header fields indicates that the connection SHOULD NOT be considered `persistent‘ (section 8.1) after the current request/response is complete.

HTTP/1.1 applications that do not support persistent connections MUST include the „close“ connection option in every message.

PHP-Arrays vs. JavaScript-Arrays in Forms

Uhhhh, das war echt ne harte Nuss, die mich da eine Weile beschäftigt hat. Alte Coder werden mich jetzt auslachen, ist mir aber egal, ich denke schon, dass der ein oder andere auch auf dieses Problem stoßen könnte und nach einer Lösung sucht. Also, worum geht’s?

In HTML kann man in einem Form z.B. ein Array in der Art

<input type=“text“ name=“meinArray[]“ value=“1234″/>
<input type=“text“ name=“meinArray[]“ value=“5678″/>
<input type=“text“ name=“meinArray[]“ value=“9012″/>

erzeugen, d.h. im Array meinArray gibt es die Elemente meinArray[0], meinArray[1] und meinArray[2] jeweils mit den Werten „1234“,„5678“ und „9012“.

Über PHP kann man ja auf die einzelnen Elemente prima zugreifen, z.B. so:

$meinArray = $_POST[‚meinArray‘];
for ($i=0; $i<count($meinArray); $i++) {
echo „Wert in meinArray an der Stelle“ . $i . “ = “ . $meinArray[$i];
}

oder auch so:

foreach($_POST[‚meinArray‘] as $key=>$value) {
echo $key.‘ ‚.$value;
}

Wer jetzt glaubt, er könnte das in JavaScript so ähnlich machen, hat sich geschnitten. Etwas in der Form (hier nur beispielhaft)

var meinArray = document.forms[0].meinArray;
for ($i=0; $i<meinArray.length; $i++) {
alert( „Wert in meinArray an der Stelle“ + i + “ = “ + meinArray[i]; // oder auch noch .value hinten dran, ist aber egal, geht eh nicht.
}

funktioniert einfach nicht. Richtig ist hingegen das hier:

var meinArray = document.forms[0].elements[„meinArray[]“];
for(i=0;i<meinArray.length;i++) {
alert( ‚Wert in meinArray an der Stelle‘ + i + ‚ = ‚+ meinArray[i].value);
}

Siehe auch http://de.selfhtml.org/javascript/objekte/elements.htm. Hat ne Weile gedauert, bis ich dahinter gestiegen bin.